1 /* GabeditXYPlot.c */
2 /**********************************************************************************************************
3 Copyright (c) 2002-2013 Abdul-Rahman Allouche. All rights reserved
4
5 Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
6 documentation files (the Gabedit), to deal in the Software without restriction, including without limitation
7 the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software,
8 and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
9
10 The above copyright notice and this permission notice shall be included in all copies or substantial portions
11 of the Software.
12
13 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
14 TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
15 THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
16 CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
17 DEALINGS IN THE SOFTWARE.
18 ************************************************************************************************************/
19
20 #define GETTEXT_PACKAGE "gabedit"
21 #include <stdlib.h>
22 #include <ctype.h>
23 #include <math.h>
24 #include <stdio.h>
25 #include <string.h>
26 #include <gdk/gdk.h>
27 #include <gdk/gdkkeysyms.h>
28 #include <gtk/gtk.h>
29 #include <glib/gi18n.h>
30 #include <cairo-pdf.h>
31 #include <cairo-ps.h>
32 #include <cairo-svg.h>
33
34 #include "GabeditXYPlot.h"
35
36 #define XYPLOT_DEFAULT_SIZE 300
37 #define BSIZE 1024
38 #define SCALE(i) (i / 65535.)
39 #define SCALE2(i) (i * 65535.)
40
41 typedef enum
42 {
43 JDX_TYPE_XYDATA,
44 JDX_TYPE_XYPOINTS,
45 JDX_TYPE_XYTABLE,
46 JDX_TYPE_UNKNOWN
47 } JDXType;
48
49 /****************************************************************************************/
50 static gint get_distance_M_AB(GabeditXYPlot *xyplot,gint xM, gint yM, gint ixA, gint iyA, gint ixB, gint iyB);
51 static void gabedit_xyplot_cairo_string(cairo_t* cr, GtkWidget *widget, GdkGC* gc, gint x, gint y, G_CONST_RETURN gchar* str, gboolean centerX, gboolean centerY, gdouble angle);
52 static void gabedit_xyplot_cairo_line(cairo_t* cr, GtkWidget *widget, GdkGC* gc, gdouble x1,gdouble y1,gdouble x2,gdouble y2);
53 static void gabedit_xyplot_cairo_lines(cairo_t *cr, GtkWidget* widget, GdkGC* gc, GdkPoint* points, gint size);
54 static void gabedit_xyplot_cairo_rectangle(cairo_t* cr, GtkWidget *widget, GdkGC* gc, gboolean fill, gdouble x1,gdouble y1,gdouble w,gdouble h);
55 /* static void gabedit_xyplot_cairo_cercle(cairo_t* cr, GtkWidget *widget, GdkGC* gc, gint xc,gint yc,gint rayon);*/
56
57 static void xyplot_cairo_string(GabeditXYPlot *xyplot, cairo_t* cr, GtkWidget* widget, GdkGC* gc, gint x, gint y, G_CONST_RETURN gchar* str, gboolean centerX, gboolean centerY, gdouble angle);
58 static void xyplot_cairo_line(GabeditXYPlot *xyplot, cairo_t* cr, GtkWidget* widget, GdkGC* gc, gdouble x1,gdouble y1,gdouble x2,gdouble y2);
59 static void xyplot_cairo_lines(GabeditXYPlot *xyplot, cairo_t* cr, GtkWidget* widget, GdkGC* gc, GdkPoint* points, gint size);
60 static void xyplot_cairo_rectangle(GabeditXYPlot *xyplot, cairo_t* cr, GtkWidget* widget, GdkGC* gc, gboolean fill, gdouble x1,gdouble y1,gdouble w,gdouble h);
61 /* static void xyplot_cairo_cercle(GabeditXYPlot *xyplot, cairo_t* cr, GtkWidget* widget, GdkGC* gc, gint xc,gint yc,gint rayon);*/
62
63 static void gabedit_xyplot_class_init (GabeditXYPlotClass *klass);
64 static void gabedit_xyplot_init (GabeditXYPlot *xyplot);
65 static void gabedit_xyplot_destroy (GtkObject *object);
66 static void gabedit_xyplot_realize (GtkWidget *widget);
67 static void gabedit_xyplot_size_request (GtkWidget *widget, GtkRequisition *requisition);
68 static void gabedit_xyplot_size_allocate (GtkWidget *widget, GtkAllocation *allocation);
69 static gint gabedit_xyplot_expose (GtkWidget *widget, GdkEventExpose *event);
70 static gint gabedit_xyplot_button_press (GtkWidget *widget, GdkEventButton *event);
71 static gint gabedit_xyplot_button_release (GtkWidget *widget, GdkEventButton *event);
72 static gint gabedit_xyplot_motion_notify (GtkWidget *widget, GdkEventMotion *event);
73 static gint gabedit_xyplot_key_press(GtkWidget* widget, GdkEventKey *event);
74 static gint gabedit_xyplot_key_release(GtkWidget* widget, GdkEventKey *event);
75 static gint gabedit_xyplot_scroll (GtkWidget *widget, GdkEventScroll *event);
76 static void gabedit_xyplot_style_set (GtkWidget *widget, GtkStyle *previous_style);
77 static gint gabedit_xyplot_grab(GtkWidget* widget, GdkEventCrossing* event);
78 static void xyplot_enable_grids (GabeditXYPlot *xyplot, GabeditXYPlotGrid grid, gboolean enable);
79 static void xyplot_show_left_legends (GabeditXYPlot *xyplot, gboolean show);
80 static void xyplot_show_right_legends (GabeditXYPlot *xyplot, gboolean show);
81 static void xyplot_show_top_legends (GabeditXYPlot *xyplot, gboolean show);
82 static void xyplot_show_bottom_legends (GabeditXYPlot *xyplot, gboolean show);
83 static void xyplot_show_rectangle_legends (GabeditXYPlot *xyplot, gboolean show);
84 static void xyplot_reflect_x (GabeditXYPlot *xyplot, gboolean enable);
85 static void xyplot_reflect_y (GabeditXYPlot *xyplot, gboolean enable);
86 static void saveAsGabeditDlg(GtkWidget* xyplot);
87 static void readAGabeditDlg(GtkWidget* xyplot);
88 static void reset_theme(GtkWidget *widget, gint line_width, GdkColor* foreColor, GdkColor* backColor );
89 static void set_theme_publication(GtkWidget *widget);
90 static void set_theme_green_black(GtkWidget *widget);
91 static void set_theme_dialog(GtkWidget* widget);
92 static void gabedit_xyplot_cairo_layout(cairo_t* cr, gdouble x, gdouble y, PangoLayout *layout, gboolean centerX, gboolean centerY, gdouble angle);
93
94 /****************************************************************************************/
95 static GtkWidgetClass *parent_class = NULL; /* TO DELETE */
96 /****************************************************************************************/
97 static void xyplot_calculate_sizes (GabeditXYPlot *xyplot);
98 static void value2pixel(GabeditXYPlot *xyplot, gdouble xv, gdouble yv, gint *x, gint *y);
99 static void pixel2value(GabeditXYPlot *xyplot, gint xp, gint yp, gdouble *x, gdouble *y);
100 static void xyplot_calculate_legends_sizes(GabeditXYPlot *xyplot);
101 static void xyplot_build_legends(GabeditXYPlot *xyplot);
102 static void xyplot_free_legends(GabeditXYPlot *xyplot);
103 static void xyplot_build_points_data(GabeditXYPlot *xyplot, XYPlotData *data);
104 static PangoLayout* get_pango_str(GabeditXYPlot *xyplot, G_CONST_RETURN gchar* txt);
105 static void xyplot_curve_noconv(GabeditXYPlot *xyplot, gint numberOfPoints, gdouble* X, gdouble* Y, GdkColor* color);
106
107 /****************************************************************************************/
uppercase(gchar * str)108 static void uppercase(gchar *str)
109 {
110 while( *str != '\0')
111 {
112 if (isalpha((gint)*str))
113 if (islower((gint)*str))
114 *str = toupper((gint)*str);
115 str ++;
116 }
117 }
118 /****************************************************************************************/
build_linear_x(gdouble * x0,gdouble * y0,gint n,gdouble ** X,gdouble ** Y,gint N)119 static void build_linear_x(gdouble* x0, gdouble* y0, gint n, gdouble**X, gdouble** Y, gint N)
120 {
121
122 gdouble dx = 0;
123 gdouble* x = NULL;
124 gdouble* y = NULL;
125 gint i,j;
126 *X= x;
127 *Y= y;
128 if(n<1||N<2) return;
129 x = g_malloc(N*sizeof(gdouble));
130 y = g_malloc(N*sizeof(gdouble));
131 dx = (x0[n-1]-x0[0])/(N-1);
132
133 x[0] = x0[0];
134 for(i=1;i<N; i++) x[i] = x[i-1]+dx;
135 y[0] = y0[0];
136 for(i=1;i<N; i++)
137 {
138 for(j=n-1;j>=0; j--) if(x[i]>x0[j]) break;
139 if(j==n-1) y[i] = y0[j];
140 else y[i] = (y0[j+1]-y0[j])/(x0[j+1]-x0[j])*(x[i]-x0[j])+y0[j];
141 }
142 *X = x;
143 *Y = y;
144 }
145 /****************************************************************************************/
xyplot_message(gchar * message)146 static void xyplot_message(gchar* message)
147 {
148 GtkWidget* dialog = NULL;
149 dialog = gtk_message_dialog_new_with_markup (NULL,
150 GTK_DIALOG_DESTROY_WITH_PARENT,
151 GTK_MESSAGE_INFO, GTK_BUTTONS_OK,
152 "%s",
153 message);
154 gtk_dialog_run (GTK_DIALOG (dialog));
155 gtk_widget_destroy (dialog);
156 }
157 /**********************************************************************************/
calc_arrow_vertexes(gdouble arrow_degrees,gdouble arrow_lenght,gdouble start_x,gdouble start_y,gdouble end_x,gdouble end_y,gdouble * x1,gdouble * y1,gdouble * x2,gdouble * y2)158 static void calc_arrow_vertexes(
159 gdouble arrow_degrees,
160 gdouble arrow_lenght,
161 gdouble start_x, gdouble start_y,
162 gdouble end_x, gdouble end_y,
163 gdouble* x1, gdouble* y1,
164 gdouble* x2, gdouble* y2
165 )
166 {
167 gdouble angle = atan2 (end_y - start_y, end_x - start_x) + M_PI;
168 arrow_degrees = arrow_degrees/180.0*M_PI;
169
170 *x1 = end_x + arrow_lenght * cos(angle - arrow_degrees);
171 *y1 = end_y + arrow_lenght * sin(angle - arrow_degrees);
172 *x2 = end_x + arrow_lenght * cos(angle + arrow_degrees);
173 *y2 = end_y + arrow_lenght * sin(angle + arrow_degrees);
174 }
175
176 /**********************************************************************************/
gabedit_xyplot_cairo_image(cairo_t * cr,GtkWidget * widget,gint x,gint y,gint w,gint h,cairo_surface_t * image)177 static void gabedit_xyplot_cairo_image(cairo_t* cr, GtkWidget *widget, gint x, gint y, gint w, gint h, cairo_surface_t *image)
178 {
179 gint ow = 1;
180 gint oh = 1;
181 if(!image) return;
182 if(x<0||y<0) return;
183 /* printf("x = %d y = %d w = %d h = %d\n",x,y,w,h);*/
184 ow = cairo_image_surface_get_width (image);
185 oh = cairo_image_surface_get_height (image);
186
187 cairo_save (cr);
188
189 cairo_translate (cr, x,y);
190 cairo_scale (cr, (gdouble)w/ow, (gdouble)h/oh);
191 cairo_set_source_surface (cr, image, 0, 0);
192 cairo_paint (cr);
193
194 cairo_stroke (cr);
195 cairo_restore (cr);
196 }
197 /**********************************************************************************/
gabedit_xyplot_cairo_string(cairo_t * cr,GtkWidget * widget,GdkGC * gc,gint x,gint y,G_CONST_RETURN gchar * str,gboolean centerX,gboolean centerY,gdouble angle)198 static void gabedit_xyplot_cairo_string(cairo_t* cr, GtkWidget *widget, GdkGC* gc, gint x, gint y, G_CONST_RETURN gchar* str, gboolean centerX, gboolean centerY, gdouble angle)
199 {
200 PangoLayout* pango = get_pango_str(GABEDIT_XYPLOT(widget), str);
201 gabedit_xyplot_cairo_layout(cr, x, y, pango, centerX, centerY, angle) ;
202 g_object_unref(G_OBJECT(pango));
203 }
204 /*****************************************************************************/
gabedit_xyplot_cairo_line(cairo_t * cr,GtkWidget * widget,GdkGC * gc,gdouble x1,gdouble y1,gdouble x2,gdouble y2)205 static void gabedit_xyplot_cairo_line(cairo_t *cr, GtkWidget* widget, GdkGC* gc, gdouble x1,gdouble y1,gdouble x2,gdouble y2)
206 {
207 GdkGCValues values;
208 GdkColor color;
209 double r,g,b;
210 GdkColormap *colormap;
211 double dashes[] = {5.0, /* ink */
212 5.0, /* skip */
213 10.0, /* ink */
214 5.0 /* skip*/
215 };
216 int ndash = sizeof (dashes)/sizeof(dashes[0]);
217 double offset = -5.0;
218
219
220 if(!cr) return;
221 if(!gc) return;
222 cairo_save (cr);
223 gdk_gc_get_values(gc, &values);
224
225 switch(values.cap_style)
226 {
227 case GDK_CAP_NOT_LAST:
228 cairo_set_line_cap(cr, CAIRO_LINE_CAP_BUTT); break;
229 case GDK_CAP_BUTT:
230 cairo_set_line_cap(cr, CAIRO_LINE_CAP_BUTT); break;
231 case GDK_CAP_ROUND:
232 cairo_set_line_cap(cr, CAIRO_LINE_CAP_ROUND); break;
233 case GDK_CAP_PROJECTING:
234 cairo_set_line_cap(cr, CAIRO_LINE_CAP_SQUARE); break;
235 default:
236 cairo_set_line_cap(cr, CAIRO_LINE_CAP_BUTT); break;
237 }
238 switch(values.join_style)
239 {
240 case GDK_JOIN_MITER:
241 cairo_set_line_join (cr, CAIRO_LINE_JOIN_MITER);break;
242 case GDK_JOIN_ROUND :
243 cairo_set_line_join (cr, CAIRO_LINE_JOIN_ROUND);break;
244 case GDK_JOIN_BEVEL :
245 cairo_set_line_join (cr, CAIRO_LINE_JOIN_BEVEL);break;
246 default:
247 cairo_set_line_join (cr, CAIRO_LINE_JOIN_MITER);break;
248 }
249 switch(values.line_style)
250 {
251 case GDK_LINE_SOLID : ndash = 0; break;
252 case GDK_LINE_ON_OFF_DASH : ndash = 2; break;
253 case GDK_LINE_DOUBLE_DASH : break;
254 default : ndash = 0;
255 }
256 colormap = gdk_window_get_colormap(widget->window);
257 gdk_colormap_query_color(colormap, values.foreground.pixel,&color);
258
259 if( ndash != 0) cairo_set_dash (cr, dashes, ndash, offset);
260
261 r = SCALE(color.red);
262 g = SCALE(color.green);
263 b = SCALE(color.blue);
264 cairo_set_source_rgba (cr, r, g, b, 1.0);
265 if(values.line_width<1) values.line_width = 1;
266
267 cairo_set_line_width (cr, values.line_width);
268 cairo_move_to (cr, x1, y1);
269 cairo_line_to (cr, x2, y2);
270 cairo_stroke (cr);
271 cairo_restore (cr);
272 }
273 /*****************************************************************************/
gabedit_xyplot_cairo_lines(cairo_t * cr,GtkWidget * widget,GdkGC * gc,GdkPoint * points,gint size)274 static void gabedit_xyplot_cairo_lines(cairo_t *cr, GtkWidget* widget, GdkGC* gc, GdkPoint* points, gint size)
275 {
276 gint i;
277 for(i=0;i<size-1;i++)
278 gabedit_xyplot_cairo_line(cr, widget, gc, points[i].x, points[i].y, points[i+1].x, points[i+1].y);
279 }
280 /*****************************************************************************/
gabedit_xyplot_cairo_rectangle(cairo_t * cr,GtkWidget * widget,GdkGC * gc,gboolean fill,gdouble x1,gdouble y1,gdouble w,gdouble h)281 static void gabedit_xyplot_cairo_rectangle(cairo_t *cr, GtkWidget* widget, GdkGC* gc, gboolean fill, gdouble x1,gdouble y1,gdouble w,gdouble h)
282 {
283 GdkGCValues values;
284 GdkColor color;
285 double r,g,b;
286 GdkColormap *colormap;
287 double dashes[] = {5.0, /* ink */
288 5.0, /* skip */
289 10.0, /* ink */
290 5.0 /* skip*/
291 };
292 int ndash = sizeof (dashes)/sizeof(dashes[0]);
293 double offset = 0.0;
294
295
296 if(!cr) return;
297 if(!gc) return;
298 cairo_save (cr);
299 gdk_gc_get_values(gc, &values);
300
301 switch(values.cap_style)
302 {
303 case GDK_CAP_NOT_LAST:
304 cairo_set_line_cap(cr, CAIRO_LINE_CAP_BUTT); break;
305 case GDK_CAP_BUTT:
306 cairo_set_line_cap(cr, CAIRO_LINE_CAP_BUTT); break;
307 case GDK_CAP_ROUND:
308 cairo_set_line_cap(cr, CAIRO_LINE_CAP_ROUND); break;
309 case GDK_CAP_PROJECTING:
310 cairo_set_line_cap(cr, CAIRO_LINE_CAP_SQUARE); break;
311 default:
312 cairo_set_line_cap(cr, CAIRO_LINE_CAP_BUTT); break;
313 }
314 switch(values.join_style)
315 {
316 case GDK_JOIN_MITER:
317 cairo_set_line_join (cr, CAIRO_LINE_JOIN_MITER);break;
318 case GDK_JOIN_ROUND :
319 cairo_set_line_join (cr, CAIRO_LINE_JOIN_ROUND);break;
320 case GDK_JOIN_BEVEL :
321 cairo_set_line_join (cr, CAIRO_LINE_JOIN_BEVEL);break;
322 default:
323 cairo_set_line_join (cr, CAIRO_LINE_JOIN_MITER);break;
324 }
325 switch(values.line_style)
326 {
327 case GDK_LINE_SOLID : ndash = 0; break;
328 case GDK_LINE_ON_OFF_DASH : ndash = 2; break;
329 case GDK_LINE_DOUBLE_DASH : break;
330 default : ndash = 0;
331 }
332 colormap = gdk_window_get_colormap(widget->window);
333 gdk_colormap_query_color(colormap, values.foreground.pixel,&color);
334
335 if( ndash != 0) cairo_set_dash (cr, dashes, ndash, offset);
336
337 r = SCALE(color.red);
338 g = SCALE(color.green);
339 b = SCALE(color.blue);
340 cairo_set_source_rgba (cr, r, g, b, 1.0);
341
342 cairo_move_to (cr, x1, y1);
343 cairo_rel_line_to (cr, w, 0);
344 cairo_rel_line_to (cr, 0, h);
345 cairo_rel_line_to (cr, -w, 0);
346 cairo_close_path (cr);
347 if(values.line_width<1) values.line_width = 1;
348 if(fill) cairo_fill(cr);
349 else cairo_set_line_width (cr, values.line_width);
350 cairo_stroke (cr);
351 cairo_restore (cr);
352 }
353 /**********************************************************************************/
gabedit_xyplot_cairo_layout(cairo_t * cr,gdouble x,gdouble y,PangoLayout * layout,gboolean centerX,gboolean centerY,gdouble angle)354 static void gabedit_xyplot_cairo_layout(cairo_t* cr, gdouble x, gdouble y, PangoLayout *layout, gboolean centerX, gboolean centerY, gdouble angle)
355 {
356 cairo_save (cr);
357 if(centerX || centerY)
358 {
359 gint w;
360 gint h;
361 pango_layout_get_size(layout,&w,&h);
362 if(centerX) x-=w/2/PANGO_SCALE*cos(angle)-h/2/PANGO_SCALE*sin(angle);
363 if(centerY) y-=w/2/PANGO_SCALE*sin(angle)+h/2/PANGO_SCALE*cos(angle);
364 }
365 cairo_move_to(cr, x,y);
366 cairo_rotate(cr, angle);
367
368 pango_cairo_show_layout(cr,layout);
369 cairo_stroke (cr);
370 cairo_restore (cr);
371 }
372 /****************************************************************************************/
xyplot_cairo_image(GabeditXYPlot * xyplot,cairo_t * cr,GtkWidget * widget,gint x,gint y,gint w,gint h,cairo_surface_t * image)373 static void xyplot_cairo_image(GabeditXYPlot *xyplot, cairo_t* cr, GtkWidget *widget, gint x, gint y, gint w, gint h, cairo_surface_t *image)
374 {
375 gabedit_xyplot_cairo_image(cr, widget, x, y, w, h, image);
376 if(xyplot->cairo_export)
377 gabedit_xyplot_cairo_image(xyplot->cairo_export, widget, x, y, w, h, image);
378 }
379 /****************************************************************************************/
xyplot_cairo_string(GabeditXYPlot * xyplot,cairo_t * cr,GtkWidget * widget,GdkGC * gc,gint x,gint y,G_CONST_RETURN gchar * str,gboolean centerX,gboolean centerY,gdouble angle)380 static void xyplot_cairo_string(GabeditXYPlot *xyplot, cairo_t* cr, GtkWidget* widget, GdkGC* gc, gint x, gint y, G_CONST_RETURN gchar* str, gboolean centerX, gboolean centerY, gdouble angle)
381 {
382
383 gabedit_xyplot_cairo_string(cr, widget, gc, x, y, str, centerX, centerY, angle);
384 if(xyplot->cairo_export)
385 gabedit_xyplot_cairo_string(xyplot->cairo_export, widget, gc, x, y, str, centerX, centerY, angle);
386 }
387 /****************************************************************************************/
xyplot_cairo_line(GabeditXYPlot * xyplot,cairo_t * cr,GtkWidget * widget,GdkGC * gc,gdouble x1,gdouble y1,gdouble x2,gdouble y2)388 static void xyplot_cairo_line(GabeditXYPlot *xyplot, cairo_t* cr, GtkWidget* widget, GdkGC* gc, gdouble x1,gdouble y1,gdouble x2,gdouble y2)
389 {
390 gabedit_xyplot_cairo_line(cr, widget, gc, x1, y1, x2, y2);
391 if(xyplot->cairo_export)
392 gabedit_xyplot_cairo_line(xyplot->cairo_export, widget, gc, x1, y1, x2, y2);
393 }
394 /****************************************************************************************/
xyplot_cairo_rectangle(GabeditXYPlot * xyplot,cairo_t * cr,GtkWidget * widget,GdkGC * gc,gboolean fill,gdouble x1,gdouble y1,gdouble x2,gdouble y2)395 static void xyplot_cairo_rectangle(GabeditXYPlot *xyplot, cairo_t* cr, GtkWidget* widget, GdkGC* gc, gboolean fill, gdouble x1,gdouble y1,gdouble x2,gdouble y2)
396 {
397 gabedit_xyplot_cairo_rectangle(cr, widget, gc, fill, x1, y1, x2, y2);
398 if(xyplot->cairo_export)
399 gabedit_xyplot_cairo_rectangle(xyplot->cairo_export, widget, gc, fill, x1, y1, x2, y2);
400 }
401 /****************************************************************************************/
xyplot_cairo_lines(GabeditXYPlot * xyplot,cairo_t * cr,GtkWidget * widget,GdkGC * gc,GdkPoint * points,gint size)402 static void xyplot_cairo_lines(GabeditXYPlot *xyplot, cairo_t* cr, GtkWidget* widget, GdkGC* gc, GdkPoint* points, gint size)
403 {
404 gabedit_xyplot_cairo_lines(cr, widget, gc, points, 2);
405 if(xyplot->cairo_export && size>0)
406 {
407 GdkPoint* pointsScal = g_malloc(size*sizeof(GdkPoint));
408 gint i;
409 if(!pointsScal) return;
410 for(i=0;i<size;i++)
411 {
412 pointsScal[i].x = points[i].x + xyplot->plotting_rect.x;
413 pointsScal[i].y = points[i].y + xyplot->plotting_rect.y;
414 }
415 gabedit_xyplot_cairo_lines(xyplot->cairo_export, widget, gc, pointsScal, 2);
416 if(pointsScal) g_free(pointsScal);
417 }
418 }
419 /****************************************************************************************/
420 /*
421 static void xyplot_cairo_cercle(GabeditXYPlot *xyplot, cairo_t* cr, GtkWidget* widget, GdkGC* gc, gint xc,gint yc,gint rayon)
422 {
423 gabedit_xyplot_cairo_cercle(cr, widget, gc, xc, yc, rayon);
424 if(xyplot->cairo_export)
425 gabedit_xyplot_cairo_cercle(xyplot->cairo_export, widget, gc, xc, yc, rayon);
426 }
427 */
428 /****************************************************************************************/
xyplot_cairo_layout(GabeditXYPlot * xyplot,cairo_t * cr,gdouble x,gdouble y,PangoLayout * layout,gboolean centerX,gboolean centerY,gdouble angle)429 static void xyplot_cairo_layout(GabeditXYPlot *xyplot, cairo_t* cr, gdouble x, gdouble y, PangoLayout *layout, gboolean centerX, gboolean centerY, gdouble angle)
430 {
431 gabedit_xyplot_cairo_layout(cr, x, y, layout, centerX, centerY, angle);
432 if(xyplot->cairo_export)
433 {
434 if(cr == xyplot->cairo_area)
435 {
436 x += xyplot->plotting_rect.x;
437 y += xyplot->plotting_rect.y;
438 }
439 gabedit_xyplot_cairo_layout(xyplot->cairo_export, x, y, layout, centerX, centerY, angle);
440 }
441 }
442 /****************************************************************************************/
443 /*
444 static void list_utf8()
445 {
446 gchar tmp[10000];
447 gchar t[10000];
448 GtkWidget* dialog = NULL;
449 gint i=32;
450 sprintf(tmp,"%d(<span>&#%d;</span>) ",i,i);
451
452 for(i=9600;i<9700;i++)
453 {
454
455 sprintf(t,"%s",tmp);
456 sprintf(tmp,"%s %d(<span>&#%d;</span>) ",t,i,i);
457 }
458 dialog = gtk_message_dialog_new_with_markup (NULL,
459 GTK_DIALOG_DESTROY_WITH_PARENT,
460 GTK_MESSAGE_INFO,
461 GTK_BUTTONS_YES_NO,
462 tmp
463 );
464 gtk_dialog_run (GTK_DIALOG (dialog));
465 gtk_widget_destroy (dialog);
466 }
467 */
468 /****************************************************************************************/
get_parent_window(GtkWidget * widget)469 static GtkWidget* get_parent_window(GtkWidget* widget)
470 {
471 GtkWidget* parent = NULL;
472 GtkWidget* child = widget;
473 do
474 {
475 parent = gtk_widget_get_parent(child);
476 child = parent;
477 }
478 while( parent && !GTK_IS_WINDOW(parent));
479 return parent;
480 }
481 /****************************************************************************************/
destroy_xyplot_window(GtkWidget * xyplot)482 static void destroy_xyplot_window(GtkWidget* xyplot)
483 {
484 GtkWidget* parentWindow;
485 parentWindow = get_parent_window(GTK_WIDGET(xyplot));
486 if(parentWindow) gtk_object_destroy (GTK_OBJECT(parentWindow));
487 }
488 /****************************************************************************************/
get_fore_color(GabeditXYPlot * xyplot)489 static GdkColor get_fore_color(GabeditXYPlot *xyplot)
490 {
491 GdkGCValues values;
492 GdkColormap *colormap;
493 GdkColor color;
494
495 gdk_gc_get_values(xyplot->fore_gc, &values);
496 colormap = gdk_window_get_colormap(GTK_WIDGET(xyplot)->window);
497 gdk_colormap_query_color(colormap, values.foreground.pixel,&color);
498 return color;
499 }
500 /****************************************************************************************/
destroy_data_dialog(GtkWidget * win,GdkEvent * event,gpointer user_data)501 static void destroy_data_dialog(GtkWidget* win, GdkEvent *event, gpointer user_data)
502 {
503 gtk_object_destroy (GTK_OBJECT(win));
504 }
505 /********************************************************************************/
remove_all_data(GtkWidget * xyplot,gint response_id)506 static gboolean remove_all_data(GtkWidget* xyplot, gint response_id)
507 {
508 if(response_id != GTK_RESPONSE_YES) return FALSE;
509 if(!xyplot) return FALSE;
510 if(GABEDIT_XYPLOT(xyplot)->data_list)
511 {
512 g_list_foreach(GABEDIT_XYPLOT(xyplot)->data_list, (GFunc)g_free, NULL);
513 g_list_free(GABEDIT_XYPLOT(xyplot)->data_list);
514 GABEDIT_XYPLOT(xyplot)->data_list = NULL;
515 }
516 gtk_widget_queue_draw(GTK_WIDGET(xyplot));
517 return TRUE;
518 }
519 /********************************************************************************/
remove_all_data_dlg(GtkWidget * xyplot)520 static void remove_all_data_dlg(GtkWidget* xyplot)
521 {
522 GtkWidget* parentWindow = get_parent_window(GTK_WIDGET(xyplot));
523 GtkWidget* dialog = gtk_message_dialog_new (GTK_WINDOW(parentWindow),
524 GTK_DIALOG_DESTROY_WITH_PARENT,
525 GTK_MESSAGE_QUESTION,
526 GTK_BUTTONS_YES_NO,
527 _("Are you sure to remove all data ?")
528 );
529 gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_NO);
530 g_signal_connect_swapped(dialog, "response", G_CALLBACK (remove_all_data), xyplot);
531 gtk_dialog_run (GTK_DIALOG (dialog));
532 gtk_widget_destroy (dialog);
533 }
534 /*****************************************************************************************/
file_chooser_set_filters(GtkFileChooser * fileChooser,gchar ** patterns)535 static void file_chooser_set_filters(GtkFileChooser *fileChooser,gchar **patterns)
536 {
537 GtkFileFilter *filter;
538 GtkFileFilter *filter0 = NULL;
539 gint n = 0;
540
541 g_return_if_fail (fileChooser != NULL);
542 g_return_if_fail (GTK_IS_FILE_CHOOSER(fileChooser));
543 g_return_if_fail (patterns != NULL);
544 while(patterns[n])
545 {
546 filter = gtk_file_filter_new ();
547 gtk_file_filter_set_name (filter, patterns[n]);
548 gtk_file_filter_add_pattern (filter, patterns[n]);
549 gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (fileChooser), filter);
550 if(n==0) filter0 = filter;
551 n++;
552 }
553 if(filter0)gtk_file_chooser_set_filter (GTK_FILE_CHOOSER (fileChooser), filter0);
554 }
555 /********************************************************************************/
new_file_chooser_open(GtkWidget * parentWindow,GCallback * func,gchar * title,gchar ** patternsfiles)556 static GtkWidget* new_file_chooser_open(GtkWidget* parentWindow, GCallback *func, gchar* title, gchar** patternsfiles)
557 {
558 GtkWidget* filesel = NULL;
559 filesel = g_object_new (GTK_TYPE_FILE_CHOOSER_DIALOG, "action", GTK_FILE_CHOOSER_ACTION_OPEN, "file-system-backend", "gtk+", "select-multiple", FALSE, NULL);
560 gtk_window_set_title (GTK_WINDOW (filesel), title);
561 gtk_dialog_add_buttons (GTK_DIALOG (filesel), GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_OK, NULL);
562 gtk_dialog_set_default_response (GTK_DIALOG (filesel), GTK_RESPONSE_OK);
563
564 if(parentWindow) gtk_window_set_transient_for(GTK_WINDOW(filesel),GTK_WINDOW(parentWindow));
565
566 gtk_window_set_modal (GTK_WINDOW (filesel), TRUE);
567 g_signal_connect (filesel, "response", G_CALLBACK (func),GTK_OBJECT(filesel));
568 g_signal_connect_after (filesel, "response", G_CALLBACK (gtk_widget_destroy),GTK_OBJECT(filesel));
569 file_chooser_set_filters(GTK_FILE_CHOOSER(filesel),patternsfiles);
570 gtk_widget_show(filesel);
571 return filesel;
572 }
573 /********************************************************************************/
new_file_chooser_save(GtkWidget * parentWindow,GCallback * func,gchar * title,gchar ** patternsfiles)574 static GtkWidget* new_file_chooser_save(GtkWidget* parentWindow, GCallback *func, gchar* title, gchar** patternsfiles)
575 {
576 GtkWidget* filesel = NULL;
577 filesel = g_object_new (GTK_TYPE_FILE_CHOOSER_DIALOG, "action", GTK_FILE_CHOOSER_ACTION_SAVE, "file-system-backend", "gtk+", "select-multiple", FALSE, NULL);
578 gtk_window_set_title (GTK_WINDOW (filesel), title);
579 gtk_dialog_add_buttons (GTK_DIALOG (filesel), GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_SAVE, GTK_RESPONSE_OK, NULL);
580 gtk_dialog_set_default_response (GTK_DIALOG (filesel), GTK_RESPONSE_OK);
581
582 if(parentWindow) gtk_window_set_transient_for(GTK_WINDOW(filesel),GTK_WINDOW(parentWindow));
583
584 gtk_window_set_modal (GTK_WINDOW (filesel), TRUE);
585 g_signal_connect (filesel, "response", G_CALLBACK (func),GTK_OBJECT(filesel));
586 g_signal_connect_after (filesel, "response", G_CALLBACK (gtk_widget_destroy),GTK_OBJECT(filesel));
587 file_chooser_set_filters(GTK_FILE_CHOOSER(filesel),patternsfiles);
588 gtk_widget_show(filesel);
589 return filesel;
590 }
591 /********************************************************************************/
add_new_data(GtkWidget * xyplot,gint numberOfPoints,gdouble * X,gdouble * Y)592 static void add_new_data(GtkWidget* xyplot, gint numberOfPoints, gdouble* X, gdouble* Y)
593 {
594 if(numberOfPoints>0)
595 {
596 gint loop;
597 XYPlotData *data = g_malloc(sizeof(XYPlotData));
598 gint red = 0;
599 gint green = 0;
600 gint blue = 0;
601 GdkColor c = get_fore_color(GABEDIT_XYPLOT(xyplot));
602
603 red = c.red;
604 green = c.green;
605 blue = c.blue;
606
607 data->size=numberOfPoints;
608 data->x = g_malloc(numberOfPoints*sizeof(gdouble));
609 data->y = g_malloc(numberOfPoints*sizeof(gdouble));
610 for(loop = 0; loop<data->size;loop++)
611 {
612 data->x[loop] = X[loop];
613 data->y[loop] = Y[loop];
614 }
615
616 sprintf(data->point_str,"+");
617 data->point_pango = NULL;
618 xyplot_build_points_data(GABEDIT_XYPLOT(xyplot), data);
619
620 data->point_size=0;
621 data->line_width=2;
622 data->point_color.red=red;
623 data->point_color.green=green;
624 data->point_color.blue=blue;
625
626 data->line_color.red=green;
627 data->line_color.green=red;
628 data->line_color.blue=blue;
629 data->line_style=GDK_LINE_SOLID;
630 gabedit_xyplot_add_data (GABEDIT_XYPLOT(xyplot), data);
631 gabedit_xyplot_set_autorange(GABEDIT_XYPLOT(xyplot), NULL);
632 }
633 }
634 /********************************************************************************/
add_new_data_peaks(GtkWidget * xyplot,gint numberOfPoints,gdouble * X,gdouble * Y)635 static void add_new_data_peaks(GtkWidget* xyplot, gint numberOfPoints, gdouble* X, gdouble* Y)
636 {
637 if(numberOfPoints>0)
638 {
639 gint loop;
640 XYPlotData *data = g_malloc(sizeof(XYPlotData));
641 gdouble xmin = 0;
642 gdouble xmax = 0;
643 gint red = 0;
644 gint green = 0;
645 gint blue = 0;
646 GdkColor c = get_fore_color(GABEDIT_XYPLOT(xyplot));
647
648 red = c.red;
649 green = c.green;
650 blue = c.blue;
651
652 data->size=3*numberOfPoints+2;
653 data->x = g_malloc(data->size*sizeof(gdouble));
654 data->y = g_malloc(data->size*sizeof(gdouble));
655
656 xmin = X[0];
657 xmax = X[0];
658 for(loop = 1; loop<numberOfPoints;loop++)
659 {
660 if(xmin>X[loop]) xmin = X[loop];
661 if(xmax<X[loop]) xmax = X[loop];
662 }
663
664 data->x[0]=xmin;
665 data->y[0]=0;
666 data->x[data->size-1]=xmax;
667 data->y[data->size-1]=0;
668 for (loop=0; loop<numberOfPoints; loop++){
669 gint iold = loop*3+1;
670 data->x[iold]=X[loop];
671 data->y[iold]=0;
672
673 data->x[iold+1]=X[loop];
674 data->y[iold+1]=Y[loop];
675
676 data->x[iold+2]=X[loop];
677 data->y[iold+2]=0;
678 }
679
680 sprintf(data->point_str,"+");
681 data->point_pango = NULL;
682 xyplot_build_points_data(GABEDIT_XYPLOT(xyplot), data);
683
684 data->point_size=0;
685 data->line_width=2;
686 data->point_color.red=red;
687 data->point_color.green=green;
688 data->point_color.blue=blue;
689
690 data->line_color.red=green;
691 data->line_color.green=red;
692 data->line_color.blue=blue;
693 data->line_style=GDK_LINE_SOLID;
694 gabedit_xyplot_add_data (GABEDIT_XYPLOT(xyplot), data);
695 gabedit_xyplot_set_autorange(GABEDIT_XYPLOT(xyplot), NULL);
696 }
697 }
698 /****************************************************************************************/
set_object_text_pixels(GabeditXYPlot * xyplot,XYPlotObjectText * objectText)699 static void set_object_text_pixels(GabeditXYPlot *xyplot, XYPlotObjectText* objectText)
700 {
701 if(!objectText) return;
702 value2pixel(xyplot, objectText->x,objectText->y, &objectText->xi, &objectText->yi);
703 objectText->yi=xyplot->plotting_rect.height-objectText->yi;
704 pango_layout_get_size(objectText->pango, &objectText->width, &objectText->height);
705 objectText->width/=PANGO_SCALE;
706 objectText->height/=PANGO_SCALE;
707 /* objectText->yi -= objectText->height/2;*/
708 objectText->xi += xyplot->plotting_rect.x;
709 objectText->yi += xyplot->plotting_rect.y;
710 }
711 /****************************************************************************************/
get_pango_str(GabeditXYPlot * xyplot,G_CONST_RETURN gchar * txt)712 static PangoLayout* get_pango_str(GabeditXYPlot *xyplot, G_CONST_RETURN gchar* txt)
713 {
714 gchar *str = NULL;
715 GdkGCValues values;
716 GdkColormap *colormap;
717 GdkColor color;
718 gchar* rgb = NULL;
719 PangoLayout* pango;
720
721 if(!txt) return NULL;
722
723 pango = gtk_widget_create_pango_layout (GTK_WIDGET(xyplot), txt);
724 pango_layout_set_alignment(pango,PANGO_ALIGN_LEFT);
725
726 gdk_gc_get_values(xyplot->fore_gc, &values);
727 colormap = gdk_window_get_colormap(GTK_WIDGET(xyplot)->window);
728 gdk_colormap_query_color(colormap, values.foreground.pixel,&color);
729 rgb = g_strdup_printf("#%02x%02x%02x", color.red >> 8, color.green >> 8, color.blue >> 8);
730 str = g_strconcat("<span foreground='", rgb, "'>",txt, "</span>", NULL);
731 pango_layout_set_markup(pango, str, -1);
732 g_free(str);
733 return pango;
734 }
735 /****************************************************************************************/
set_object_text_pango(GabeditXYPlot * xyplot,XYPlotObjectText * objectText)736 static void set_object_text_pango(GabeditXYPlot *xyplot, XYPlotObjectText* objectText)
737 {
738 if(!objectText) return;
739 objectText->pango = get_pango_str(xyplot, objectText->str);
740 }
741 /****************************************************************************************/
set_object_text(GabeditXYPlot * xyplot,XYPlotObjectText * objectText,gdouble x,gdouble y,gdouble angle,G_CONST_RETURN gchar * str)742 static void set_object_text(GabeditXYPlot *xyplot, XYPlotObjectText* objectText, gdouble x, gdouble y, gdouble angle, G_CONST_RETURN gchar* str)
743 {
744 if(!str) return;
745 objectText->x = x;
746 objectText->y = y;
747 objectText->angle = angle;
748 objectText->str = g_strdup(str);
749 set_object_text_pango(xyplot, objectText);
750 set_object_text_pixels(xyplot, objectText);
751 }
752 /****************************************************************************************/
add_object_text(GabeditXYPlot * xyplot,gdouble x,gdouble y,gdouble angle,G_CONST_RETURN gchar * str)753 static void add_object_text(GabeditXYPlot *xyplot, gdouble x, gdouble y, gdouble angle, G_CONST_RETURN gchar* str)
754 {
755 gint i;
756 if(!str) return;
757 xyplot->nObjectsText++;
758 if(xyplot->nObjectsText==1) xyplot->objectsText = g_malloc(sizeof(XYPlotObjectText));
759 else xyplot->objectsText = g_realloc(xyplot->objectsText,xyplot->nObjectsText*sizeof(XYPlotObjectText));
760 i = xyplot->nObjectsText-1;
761 set_object_text(xyplot, &xyplot->objectsText[i], x, y, angle , str);
762 }
763 /****************************************************************************************/
reset_object_text_pixels(GabeditXYPlot * xyplot)764 static void reset_object_text_pixels(GabeditXYPlot *xyplot)
765 {
766 gint i;
767 if(!xyplot) return;
768 for(i=0;i<xyplot->nObjectsText;i++)
769 set_object_text_pixels(xyplot, &xyplot->objectsText[i]);
770 }
771 /****************************************************************************************/
reset_object_text_pango(GabeditXYPlot * xyplot)772 static void reset_object_text_pango(GabeditXYPlot *xyplot)
773 {
774 gint i;
775 if(!xyplot) return;
776 for(i=0;i<xyplot->nObjectsText;i++)
777 set_object_text_pango(xyplot, &xyplot->objectsText[i]);
778 }
779 /****************************************************************************************/
get_object_text_num(GabeditXYPlot * xyplot,gint xi,gint yi)780 static gint get_object_text_num(GabeditXYPlot *xyplot, gint xi, gint yi)
781 {
782 gint i;
783 gint x,y;
784 if(!xyplot) return -1;
785
786 for(i=0;i<xyplot->nObjectsText;i++)
787 {
788 gdouble cosa = cos(xyplot->objectsText[i].angle);
789 gdouble sina = sin(xyplot->objectsText[i].angle);
790 gdouble xx = xi-xyplot->objectsText[i].xi;
791 gdouble yy = yi-xyplot->objectsText[i].yi;
792 x = xyplot->objectsText[i].xi+xx*cosa-yy*sina;
793 y = xyplot->objectsText[i].yi+xx*sina+yy*cosa;
794 if(x>=xyplot->objectsText[i].xi && y>=xyplot->objectsText[i].yi
795 && x<=xyplot->objectsText[i].xi+xyplot->objectsText[i].width
796 && y<=xyplot->objectsText[i].yi+xyplot->objectsText[i].height)
797 return i;
798 }
799 return -1;
800 }
801 /****************************************************************************************/
delete_object_text(GtkWidget * widget,gint i)802 static void delete_object_text(GtkWidget *widget, gint i)
803 {
804 gint j;
805 GabeditXYPlot *xyplot = NULL;
806 if(!widget) return;
807 if(!GTK_IS_WIDGET(widget)) return;
808 xyplot = GABEDIT_XYPLOT(widget);
809 if(i<0||i>=xyplot->nObjectsText) return;
810 if(xyplot->objectsText[i].str) g_free(xyplot->objectsText[i].str);
811 if(xyplot->objectsText[i].pango) g_object_unref(G_OBJECT(xyplot->objectsText[i].pango));
812 for(j=i;j<xyplot->nObjectsText-1;j++)
813 xyplot->objectsText[j] = xyplot->objectsText[j+1];
814 xyplot->nObjectsText--;
815 if(xyplot->nObjectsText<1)
816 {
817 xyplot->nObjectsText = 0;
818 if(xyplot->objectsText) g_free(xyplot->objectsText);
819 xyplot->objectsText = NULL;
820 }
821 else
822 {
823 xyplot->objectsText = g_realloc(xyplot->objectsText,xyplot->nObjectsText*sizeof(XYPlotObjectText));
824 }
825
826 }
827 /****************************************************************************************/
delete_objects_text(GtkWidget * widget)828 static void delete_objects_text(GtkWidget *widget)
829 {
830 GabeditXYPlot *xyplot = NULL;
831 gint i;
832 if(!widget) return;
833 if(!GTK_IS_WIDGET(widget)) return;
834 xyplot = GABEDIT_XYPLOT(widget);
835 for(i=0;i<xyplot->nObjectsText;i++)
836 {
837 if(xyplot->objectsText[i].str) g_free(xyplot->objectsText[i].str);
838 if(xyplot->objectsText[i].pango) g_object_unref(G_OBJECT(xyplot->objectsText[i].pango));
839 }
840 xyplot->nObjectsText = 0;
841 if(xyplot->objectsText) g_free(xyplot->objectsText);
842 xyplot->objectsText = NULL;
843 gtk_widget_queue_draw(GTK_WIDGET(xyplot));
844 }
845 /********************************************************************************/
activate_entry_object_text(GtkWidget * entry,gpointer user_data)846 static void activate_entry_object_text(GtkWidget *entry, gpointer user_data)
847 {
848 G_CONST_RETURN gchar* tlabel;
849 G_CONST_RETURN gchar* tangle;
850 GtkWidget* xyplot = NULL;
851 GtkWidget* window = NULL;
852 GtkWidget* entry_label = NULL;
853 GtkWidget* entry_angle = NULL;
854 XYPlotObjectText* objectText = NULL;
855
856
857 if(!entry) return;
858 if(!GTK_IS_WIDGET(entry)) return;
859 if(!user_data || !G_IS_OBJECT(user_data)) return;
860
861 xyplot = GTK_WIDGET(user_data);
862 entry_label = g_object_get_data(G_OBJECT(entry),"EntryLabel");
863 entry_angle = g_object_get_data(G_OBJECT(entry),"EntryAngle");
864
865 if(!GTK_IS_WIDGET(entry_label)) return;
866 if(!GTK_IS_WIDGET(entry_angle)) return;
867
868 tlabel= gtk_entry_get_text(GTK_ENTRY(entry_label));
869 tangle= gtk_entry_get_text(GTK_ENTRY(entry_angle));
870 window = g_object_get_data(G_OBJECT(entry),"Window");
871 objectText = g_object_get_data(G_OBJECT(entry),"ObjectText");
872 /* t is destroyed with window */
873 if(!objectText)
874 {
875 if(window)gtk_widget_destroy(window);
876 return;
877 }
878 if(!objectText->str)
879 {
880 gdouble angle = 0;
881 if(tangle && strlen(tangle)>0) angle = atof(tangle)/180.0*M_PI;
882 add_object_text(GABEDIT_XYPLOT(xyplot), objectText->x, objectText->y, angle, tlabel);
883 g_free(objectText);
884 }
885 else
886 {
887 gdouble angle = 0;
888 if(tangle && strlen(tangle)>0) angle = atof(tangle)/180.0*M_PI;
889 if(objectText->str) g_free(objectText->str);
890 if(objectText->pango) g_object_unref(G_OBJECT(objectText->pango));
891 set_object_text(GABEDIT_XYPLOT(xyplot), objectText, objectText->x, objectText->y, angle, tlabel);
892 }
893 if(window)gtk_widget_destroy(window);
894 gtk_widget_queue_draw(GTK_WIDGET(xyplot));
895 }
896 /****************************************************************************************/
add_set_object_text_dialog(GtkWidget * xyplot,gint i,gdouble x,gdouble y)897 static void add_set_object_text_dialog(GtkWidget* xyplot, gint i, gdouble x, gdouble y)
898 {
899 GtkWidget* window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
900 GtkWidget* parentWindow = NULL;
901 GtkWidget* frame = NULL;
902 GtkWidget* hbox = NULL;
903 GtkWidget* vbox_frame = NULL;
904 GtkWidget* label = NULL;
905 GtkWidget* entry_label = NULL;
906 GtkWidget* entry_angle = NULL;
907 XYPlotObjectText* objectText = NULL;
908
909 if(i>-1 && i<GABEDIT_XYPLOT(xyplot)->nObjectsText)
910 {
911 objectText = &GABEDIT_XYPLOT(xyplot)->objectsText[i];
912 }
913 else
914 {
915 objectText = g_malloc(sizeof(XYPlotObjectText));
916 objectText->x = x;
917 objectText->y = y;
918 objectText->str = NULL;
919 objectText->pango = NULL;
920 }
921
922 gtk_window_set_title (GTK_WINDOW (window), _("Set label"));
923 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
924 gtk_window_set_modal (GTK_WINDOW (window), TRUE);
925
926 g_signal_connect(G_OBJECT(window), "delete_event", G_CALLBACK(gtk_widget_destroy), (gpointer)xyplot);
927
928 hbox=gtk_hbox_new(FALSE, 0);
929 gtk_container_add(GTK_CONTAINER(window), hbox);
930 gtk_widget_show(hbox);
931
932 frame=gtk_frame_new(NULL);
933 gtk_container_add(GTK_CONTAINER(hbox), frame);
934 gtk_widget_show(frame);
935
936 vbox_frame=gtk_vbox_new(FALSE, 0);
937 gtk_container_add(GTK_CONTAINER(frame), vbox_frame);
938 gtk_widget_show(vbox_frame);
939
940 hbox=gtk_hbox_new(FALSE, 0);
941 gtk_box_pack_start(GTK_BOX(vbox_frame), hbox, FALSE, FALSE, 2);
942 gtk_widget_show(hbox);
943
944 label=gtk_label_new(_("Label : "));
945 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 2);
946 gtk_widget_show(label);
947
948 entry_label = gtk_entry_new();
949 /* gtk_widget_set_size_request(entry_label,100,-1);*/
950 if(i>-1 && i<GABEDIT_XYPLOT(xyplot)->nObjectsText)
951 {
952 gtk_entry_set_text(GTK_ENTRY(entry_label),GABEDIT_XYPLOT(xyplot)->objectsText[i].str);
953 }
954 else
955 gtk_entry_set_text(GTK_ENTRY(entry_label),"<span foreground='blue' font_desc='20'>Blue text</span> is <i>cool</i>!");
956 gtk_box_pack_start(GTK_BOX(hbox), entry_label, TRUE, TRUE, 2);
957 gtk_widget_show(entry_label);
958
959 g_object_set_data(G_OBJECT(entry_label),"ObjectText", objectText);
960
961 label=gtk_label_new(
962 _(
963 "You can use the Pango Text Attribute Markup Language\n"
964 "Example : <span foreground='blue' font_desc='Sans 20'>Blue text</span> is <i>cool</i>!\n"
965 "\nFor insert a special character : control shift u + code UTF8\n"
966 "Examples : \n"
967 " control shift u + 03B1 for alpha (greek)\n"
968 " control shift u + 03B2 for beta (greek)\n"
969 " control shift u + 03A3 for cap Sigma (greek)\n"
970 " See http://www.utf8-chartable.de\n"
971 )
972 );
973 gtk_widget_show(label);
974 gtk_box_pack_start(GTK_BOX(vbox_frame), label, FALSE, FALSE, 2);
975
976
977 g_object_set_data(G_OBJECT(entry_label),"Window", window);
978 g_signal_connect (G_OBJECT (entry_label), "activate", (GCallback)activate_entry_object_text, xyplot);
979
980 hbox=gtk_hbox_new(FALSE, 0);
981 gtk_box_pack_start(GTK_BOX(vbox_frame), hbox, FALSE, FALSE, 2);
982 gtk_widget_show(hbox);
983
984 label=gtk_label_new(_("Angle : "));
985 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 2);
986 gtk_widget_show(label);
987
988 entry_angle = gtk_entry_new();
989 if(i>-1 && i<GABEDIT_XYPLOT(xyplot)->nObjectsText)
990 {
991 gchar* tmp = g_strdup_printf("%f", GABEDIT_XYPLOT(xyplot)->objectsText[i].angle/M_PI*180.0);
992 gtk_entry_set_text(GTK_ENTRY(entry_angle),tmp);
993 g_free(tmp);
994 }
995 else gtk_entry_set_text(GTK_ENTRY(entry_angle),"0.0");
996 gtk_box_pack_start(GTK_BOX(hbox), entry_angle, TRUE, TRUE, 2);
997 gtk_widget_show(entry_angle);
998
999 g_object_set_data(G_OBJECT(entry_angle),"ObjectText", objectText);
1000 g_object_set_data(G_OBJECT(entry_angle),"Window", window);
1001 g_object_set_data(G_OBJECT(entry_angle),"EntryLabel", entry_label);
1002 g_object_set_data(G_OBJECT(entry_angle),"EntryAngle", entry_angle);
1003 g_object_set_data(G_OBJECT(entry_label),"EntryLabel", entry_label);
1004 g_object_set_data(G_OBJECT(entry_label),"EntryAngle", entry_angle);
1005 g_signal_connect (G_OBJECT (entry_angle), "activate", (GCallback)activate_entry_object_text, xyplot);
1006
1007 parentWindow = get_parent_window(GTK_WIDGET(xyplot));
1008 if(parentWindow)
1009 {
1010 gtk_window_set_transient_for(GTK_WINDOW(window),GTK_WINDOW(parentWindow));
1011 }
1012 gtk_widget_show(window);
1013 }
1014 /****************************************************************************************/
begin_insert_objects_text(GtkWidget * widget)1015 static void begin_insert_objects_text(GtkWidget *widget)
1016 {
1017 if(!widget) return;
1018 if(!GTK_IS_WIDGET(widget)) return;
1019 GABEDIT_XYPLOT(widget)->t_key_pressed = TRUE;
1020 }
1021 /****************************************************************************************/
set_object_line_pixels(GabeditXYPlot * xyplot,XYPlotObjectLine * objectLine)1022 static void set_object_line_pixels(GabeditXYPlot *xyplot, XYPlotObjectLine* objectLine)
1023 {
1024 if(!objectLine) return;
1025 value2pixel(xyplot, objectLine->x1,objectLine->y1, &objectLine->x1i, &objectLine->y1i);
1026 objectLine->y1i=xyplot->plotting_rect.height-objectLine->y1i;
1027 objectLine->x1i += xyplot->plotting_rect.x;
1028 objectLine->y1i += xyplot->plotting_rect.y;
1029 value2pixel(xyplot, objectLine->x2,objectLine->y2, &objectLine->x2i, &objectLine->y2i);
1030 objectLine->y2i=xyplot->plotting_rect.height-objectLine->y2i;
1031 objectLine->x2i += xyplot->plotting_rect.x;
1032 objectLine->y2i += xyplot->plotting_rect.y;
1033 }
1034 /****************************************************************************************/
set_object_line(GabeditXYPlot * xyplot,XYPlotObjectLine * objectLine,gdouble x1,gdouble y1,gdouble x2,gdouble y2,gint width,gint arrow_size,GdkColor color,GdkLineStyle style)1035 static void set_object_line(GabeditXYPlot *xyplot, XYPlotObjectLine* objectLine,
1036 gdouble x1, gdouble y1,
1037 gdouble x2, gdouble y2,
1038 gint width,
1039 gint arrow_size,
1040 GdkColor color,
1041 GdkLineStyle style
1042 )
1043 {
1044 if(!objectLine) return;
1045 objectLine->x1 = x1;
1046 objectLine->y1 = y1;
1047 objectLine->x2 = x2;
1048 objectLine->y2 = y2;
1049 objectLine->width = width;
1050 objectLine->arrow_size = arrow_size;
1051 objectLine->color = color;
1052 objectLine->style = style;
1053 set_object_line_pixels(xyplot, objectLine);
1054 }
1055 /****************************************************************************************/
add_object_line(GabeditXYPlot * xyplot,gdouble x1,gdouble y1,gdouble x2,gdouble y2)1056 static void add_object_line(GabeditXYPlot *xyplot,
1057 gdouble x1, gdouble y1,
1058 gdouble x2, gdouble y2
1059 )
1060 {
1061 gint width = 1;
1062 gint arrow_size = 0;
1063 GdkColor color;
1064 GdkLineStyle style = GDK_LINE_SOLID;
1065 gint i;
1066 xyplot->nObjectsLine++;
1067 if(xyplot->nObjectsLine==1) xyplot->objectsLine = g_malloc(sizeof(XYPlotObjectLine));
1068 else xyplot->objectsLine = g_realloc(xyplot->objectsLine,xyplot->nObjectsLine*sizeof(XYPlotObjectLine));
1069 i = xyplot->nObjectsLine-1;
1070
1071 if(xyplot->nObjectsLine==1)
1072 {
1073 GdkGCValues values;
1074 GdkColormap *colormap;
1075 gdk_gc_get_values(xyplot->lines_gc, &values);
1076 colormap = gdk_window_get_colormap(GTK_WIDGET(xyplot)->window);
1077 gdk_colormap_query_color(colormap, values.foreground.pixel,&color);
1078 style = values.line_style;
1079 width = values.line_width;
1080 }
1081 else
1082 {
1083 color = xyplot->objectsLine[xyplot->nObjectsLine-2].color;
1084 style = xyplot->objectsLine[xyplot->nObjectsLine-2].style;
1085 width = xyplot->objectsLine[xyplot->nObjectsLine-2].width;
1086 arrow_size = xyplot->objectsLine[xyplot->nObjectsLine-2].arrow_size;
1087 }
1088
1089 set_object_line(xyplot, &xyplot->objectsLine[i], x1, y1, x2, y2,
1090 width,
1091 arrow_size,
1092 color,
1093 style);
1094 }
1095 /****************************************************************************************/
reset_object_line_pixels(GabeditXYPlot * xyplot)1096 static void reset_object_line_pixels(GabeditXYPlot *xyplot)
1097 {
1098 gint i;
1099 if(!xyplot) return;
1100 for(i=0;i<xyplot->nObjectsLine;i++)
1101 set_object_line_pixels(xyplot, &xyplot->objectsLine[i]);
1102 }
1103 /****************************************************************************************/
get_object_line_num(GabeditXYPlot * xyplot,gint xi,gint yi)1104 static gint get_object_line_num(GabeditXYPlot *xyplot, gint xi, gint yi)
1105 {
1106 gint i;
1107 if(!xyplot) return -1;
1108 for(i=0;i<xyplot->nObjectsLine;i++)
1109 {
1110 gint d = get_distance_M_AB(xyplot,xi,yi,
1111 xyplot->objectsLine[i].x1i,xyplot->objectsLine[i].y1i,
1112 xyplot->objectsLine[i].x2i,xyplot->objectsLine[i].y2i);
1113 if(d<5 || d<xyplot->objectsLine[i].width) return i;
1114 }
1115 return -1;
1116 }
1117 /****************************************************************************************/
delete_object_line(GtkWidget * widget,gint i)1118 static void delete_object_line(GtkWidget *widget, gint i)
1119 {
1120 gint j;
1121 GabeditXYPlot *xyplot = NULL;
1122 if(!widget) return;
1123 if(!GTK_IS_WIDGET(widget)) return;
1124 xyplot = GABEDIT_XYPLOT(widget);
1125 if(i<0||i>=xyplot->nObjectsLine) return;
1126 for(j=i;j<xyplot->nObjectsLine-1;j++)
1127 xyplot->objectsLine[j] = xyplot->objectsLine[j+1];
1128 xyplot->nObjectsLine--;
1129 if(xyplot->nObjectsLine<1)
1130 {
1131 xyplot->nObjectsLine = 0;
1132 if(xyplot->objectsLine) g_free(xyplot->objectsLine);
1133 xyplot->objectsLine = NULL;
1134 }
1135 else
1136 {
1137 xyplot->objectsLine = g_realloc(xyplot->objectsLine,xyplot->nObjectsLine*sizeof(XYPlotObjectLine));
1138 }
1139
1140 }
1141 /****************************************************************************************/
delete_objects_line(GtkWidget * widget)1142 static void delete_objects_line(GtkWidget *widget)
1143 {
1144 GabeditXYPlot *xyplot = NULL;
1145 if(!widget) return;
1146 if(!GTK_IS_WIDGET(widget)) return;
1147 xyplot = GABEDIT_XYPLOT(widget);
1148 xyplot->nObjectsLine = 0;
1149 if(xyplot->objectsLine) g_free(xyplot->objectsLine);
1150 xyplot->objectsLine = NULL;
1151 gtk_widget_queue_draw(GTK_WIDGET(xyplot));
1152 }
1153 /****************************************************************************************/
begin_insert_objects_line(GtkWidget * widget)1154 static void begin_insert_objects_line(GtkWidget *widget)
1155 {
1156 if(!widget) return;
1157 if(!GTK_IS_WIDGET(widget)) return;
1158 GABEDIT_XYPLOT(widget)->l_key_pressed = TRUE;
1159 }
1160 /****************************************************************************************/
spin_line_width_changed_value_object(GtkSpinButton * spinbutton,gpointer user_data)1161 static void spin_line_width_changed_value_object(GtkSpinButton *spinbutton, gpointer user_data)
1162 {
1163 if(user_data && G_IS_OBJECT(user_data))
1164 {
1165 GtkWidget* xyplot = GTK_WIDGET(user_data);
1166 XYPlotObjectLine* objectLine = g_object_get_data(G_OBJECT(spinbutton),"ObjectLine");
1167 g_return_if_fail (GABEDIT_IS_XYPLOT (xyplot));
1168 if(objectLine) objectLine->width = gtk_spin_button_get_value(spinbutton);
1169 else
1170 {
1171 gint i;
1172 for (i=0; i<GABEDIT_XYPLOT (xyplot)->nObjectsLine;i++)
1173 {
1174 GABEDIT_XYPLOT (xyplot)->objectsLine[i].width = gtk_spin_button_get_value(spinbutton);
1175 }
1176 }
1177 gtk_widget_queue_draw(GTK_WIDGET(xyplot));
1178 }
1179 }
1180 /****************************************************************************************/
spin_line_color_changed_value_object(GtkColorButton * colorbutton,gpointer user_data)1181 static void spin_line_color_changed_value_object(GtkColorButton *colorbutton, gpointer user_data)
1182 {
1183 if(user_data && G_IS_OBJECT(user_data))
1184 {
1185 GtkWidget* xyplot = GTK_WIDGET(user_data);
1186 XYPlotObjectLine* objectLine = g_object_get_data(G_OBJECT(colorbutton),"ObjectLine");
1187 GdkColor c;
1188 gtk_color_button_get_color (colorbutton, &c);
1189
1190 g_return_if_fail (GABEDIT_IS_XYPLOT (xyplot));
1191
1192 if(objectLine) objectLine->color = c;
1193 else
1194 {
1195 gint i;
1196 for (i=0; i<GABEDIT_XYPLOT (xyplot)->nObjectsLine;i++)
1197 {
1198 GABEDIT_XYPLOT (xyplot)->objectsLine[i].color = c;
1199 }
1200 }
1201 gtk_widget_queue_draw(GTK_WIDGET(xyplot));
1202 }
1203 }
1204 /********************************************************************************************************/
combo_line_style_changed_value_object(GtkComboBox * combobox,gpointer user_data)1205 static void combo_line_style_changed_value_object(GtkComboBox *combobox, gpointer user_data)
1206 {
1207 GtkTreeIter iter;
1208 gchar* d = NULL;
1209
1210 if (gtk_combo_box_get_active_iter (combobox, &iter))
1211 {
1212 GtkTreeModel* model = gtk_combo_box_get_model(combobox);
1213 GtkWidget* xyplot = GTK_WIDGET(user_data);
1214 XYPlotObjectLine* objectLine = g_object_get_data(G_OBJECT(combobox),"ObjectLine");
1215 g_return_if_fail (GABEDIT_IS_XYPLOT (xyplot));
1216
1217 gtk_tree_model_get (model, &iter, 0, &d, -1);
1218 if(!d) return;
1219 if(objectLine)
1220 {
1221 if (!strcmp(d,"Solid") ) { objectLine->style = GDK_LINE_SOLID; }
1222 else if (!strcmp(d,"On-Off dashed") ) {objectLine->style = GDK_LINE_ON_OFF_DASH; }
1223 else if (!strcmp(d,"Double dashed") ) { objectLine->style = GDK_LINE_DOUBLE_DASH;}
1224 }
1225 else
1226 {
1227 gint i;
1228 for (i=0; i<GABEDIT_XYPLOT (xyplot)->nObjectsLine;i++)
1229 {
1230 if (!strcmp(d,"Solid") ) { GABEDIT_XYPLOT (xyplot)->objectsLine[i].style = GDK_LINE_SOLID; }
1231 else if (!strcmp(d,"On-Off dashed") ) {GABEDIT_XYPLOT (xyplot)->objectsLine[i].style = GDK_LINE_ON_OFF_DASH; }
1232 else if (!strcmp(d,"Double dashed") ) { GABEDIT_XYPLOT (xyplot)->objectsLine[i].style = GDK_LINE_DOUBLE_DASH;}
1233 }
1234 }
1235 gtk_widget_queue_draw(GTK_WIDGET(xyplot));
1236 }
1237 }
1238 /****************************************************************************************/
spin_arrow_size_changed_value_object(GtkSpinButton * spinbutton,gpointer user_data)1239 static void spin_arrow_size_changed_value_object(GtkSpinButton *spinbutton, gpointer user_data)
1240 {
1241 if(user_data && G_IS_OBJECT(user_data))
1242 {
1243 GtkWidget* xyplot = GTK_WIDGET(user_data);
1244 XYPlotObjectLine* objectLine = g_object_get_data(G_OBJECT(spinbutton),"ObjectLine");
1245
1246 g_return_if_fail (GABEDIT_IS_XYPLOT (xyplot));
1247
1248 if(objectLine) objectLine->arrow_size = gtk_spin_button_get_value(spinbutton);
1249 else
1250 {
1251 gint i;
1252 for (i=0; i<GABEDIT_XYPLOT (xyplot)->nObjectsLine;i++)
1253 {
1254 GABEDIT_XYPLOT (xyplot)->objectsLine[i].arrow_size = gtk_spin_button_get_value(spinbutton);
1255 }
1256 }
1257 gtk_widget_queue_draw(GTK_WIDGET(xyplot));
1258 }
1259 }
1260 /********************************************************************************************************/
add_line_types_combo_object(GtkWidget * hbox)1261 static GtkWidget *add_line_types_combo_object(GtkWidget *hbox)
1262 {
1263 GtkTreeIter iter;
1264 GtkTreeStore *store;
1265 GtkTreeModel *model;
1266 GtkWidget *combobox;
1267 GtkCellRenderer *renderer;
1268
1269 store = gtk_tree_store_new (1,G_TYPE_STRING);
1270
1271 gtk_tree_store_append (store, &iter, NULL);
1272 gtk_tree_store_set (store, &iter, 0, "Solid", -1);
1273 gtk_tree_store_append (store, &iter, NULL);
1274 gtk_tree_store_set (store, &iter, 0, "On-Off dashed", -1);
1275 gtk_tree_store_append (store, &iter, NULL);
1276 gtk_tree_store_set (store, &iter, 0, "Double dashed", -1);
1277
1278 model = GTK_TREE_MODEL (store);
1279 combobox = gtk_combo_box_new_with_model (model);
1280 g_object_unref (model);
1281 gtk_box_pack_start (GTK_BOX (hbox), combobox, TRUE, TRUE, 1);
1282 renderer = gtk_cell_renderer_text_new ();
1283 gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combobox), renderer, TRUE);
1284 gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (combobox), renderer, "text", 0, NULL);
1285
1286 return combobox;
1287 }
1288 /****************************************************************************************/
set_object_line_dialog(GabeditXYPlot * xyplot,gint i)1289 static void set_object_line_dialog(GabeditXYPlot* xyplot, gint i)
1290 {
1291 GtkWidget* window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1292 GtkWidget* frame = NULL;
1293 GtkWidget* hbox = NULL;
1294 GtkWidget* hbox1 = NULL;
1295 GtkWidget* label = NULL;
1296 GtkWidget* combo = NULL;
1297 GtkWidget* spin = NULL;
1298 GtkWidget* button = NULL;
1299 GtkWidget* spin_arrow = NULL;
1300 GtkWidget* parentWindow = NULL;
1301 GtkWidget* vbox_window = NULL;
1302 XYPlotObjectLine* objectLine = NULL;
1303 GdkLineStyle line_style = GDK_LINE_SOLID;
1304
1305 if(i>=0 && i<=xyplot->nObjectsLine-1) objectLine = &xyplot->objectsLine[i];
1306 else return;
1307 line_style = objectLine->style;
1308
1309 gtk_window_set_title (GTK_WINDOW (window), _("Set line options"));
1310 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
1311 gtk_window_set_modal (GTK_WINDOW (window), TRUE);
1312
1313 g_signal_connect(G_OBJECT(window), "delete_event", G_CALLBACK(gtk_widget_destroy), (gpointer)xyplot);
1314
1315 vbox_window=gtk_vbox_new(FALSE, 0);
1316 gtk_container_add(GTK_CONTAINER(window), vbox_window);
1317 gtk_widget_show(vbox_window);
1318
1319 hbox1=gtk_hbox_new(FALSE, 0);
1320 gtk_box_pack_start(GTK_BOX(vbox_window), hbox1, TRUE, FALSE, 2);
1321 gtk_widget_show(hbox1);
1322
1323 frame = gtk_frame_new(NULL);
1324 gtk_box_pack_start(GTK_BOX(hbox1), frame, TRUE, FALSE, 2);
1325 gtk_widget_show(frame);
1326
1327 hbox=gtk_hbox_new(FALSE, 0);
1328 gtk_container_add(GTK_CONTAINER(frame), hbox);
1329 gtk_widget_show(hbox);
1330
1331 label=gtk_label_new(_("Line width :"));
1332 gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, FALSE, 2);
1333 gtk_widget_show(label);
1334
1335 spin = gtk_spin_button_new_with_range(0, 10, 1);
1336 if(objectLine) gtk_spin_button_set_value(GTK_SPIN_BUTTON(spin), objectLine->width);
1337 else gtk_spin_button_set_value(GTK_SPIN_BUTTON(spin), 1);
1338
1339 gtk_box_pack_start(GTK_BOX(hbox), spin, TRUE, FALSE, 2);
1340 gtk_widget_show(spin);
1341 g_object_set_data(G_OBJECT (window), "SpinLineWidth", spin);
1342
1343 label=gtk_label_new(_("Line type :"));
1344 gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, FALSE, 2);
1345 gtk_widget_show(label);
1346
1347 combo = add_line_types_combo_object(hbox);
1348 gtk_combo_box_set_active (GTK_COMBO_BOX (combo), 0);
1349 if(objectLine)
1350 {
1351 GdkLineStyle line_style = objectLine->style;
1352 if(line_style == GDK_LINE_SOLID) gtk_combo_box_set_active (GTK_COMBO_BOX (combo), 0);
1353 else if(line_style == GDK_LINE_ON_OFF_DASH) gtk_combo_box_set_active (GTK_COMBO_BOX (combo), 1);
1354 else if(line_style == GDK_LINE_DOUBLE_DASH) gtk_combo_box_set_active (GTK_COMBO_BOX (combo), 2);
1355 }
1356 gtk_widget_show(combo);
1357 g_object_set_data(G_OBJECT (window), "ComboLineType", combo);
1358
1359 label=gtk_label_new(_("Line color :"));
1360 gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, FALSE, 2);
1361 gtk_widget_show(label);
1362
1363 button = gtk_color_button_new_with_color (&objectLine->color);
1364 gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, FALSE, 2);
1365 gtk_widget_show(button);
1366 g_object_set_data(G_OBJECT (window), "ColorButton", button);
1367
1368 label=gtk_label_new(_("Arrow size :"));
1369 gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, FALSE, 2);
1370 gtk_widget_show(label);
1371
1372 spin_arrow = gtk_spin_button_new_with_range(0, 30, 1);
1373
1374 if(objectLine)
1375 gtk_spin_button_set_value(GTK_SPIN_BUTTON(spin_arrow), objectLine->arrow_size);
1376 gtk_box_pack_start(GTK_BOX(hbox), spin_arrow, TRUE, FALSE, 2);
1377 gtk_widget_show(spin_arrow);
1378 g_object_set_data(G_OBJECT (window), "SpinArrowSize", spin_arrow);
1379
1380
1381 g_object_set_data(G_OBJECT (spin), "ObjectLine", objectLine);
1382 g_signal_connect(G_OBJECT(spin), "value-changed", G_CALLBACK(spin_line_width_changed_value_object), xyplot);
1383
1384 g_object_set_data(G_OBJECT (button), "ObjectLine", objectLine);
1385 g_signal_connect(G_OBJECT(button), "color-set", G_CALLBACK(spin_line_color_changed_value_object), xyplot);
1386
1387 g_signal_connect(G_OBJECT(combo), "changed", G_CALLBACK(combo_line_style_changed_value_object), xyplot);
1388 g_object_set_data(G_OBJECT (combo), "ObjectLine", objectLine);
1389
1390 g_object_set_data(G_OBJECT (spin_arrow), "ObjectLine", objectLine);
1391 g_signal_connect(G_OBJECT(spin_arrow), "value-changed", G_CALLBACK(spin_arrow_size_changed_value_object), xyplot);
1392
1393
1394 parentWindow = get_parent_window(GTK_WIDGET(xyplot));
1395 if(parentWindow)
1396 {
1397 gtk_window_set_transient_for(GTK_WINDOW(window),GTK_WINDOW(parentWindow));
1398 }
1399 gtk_widget_show(window);
1400 /* list_utf8();*/
1401
1402
1403 }
1404 /**************************************************************************************************/
set_object_image_relative(GabeditXYPlot * xyplot,XYPlotObjectImage * objectImage)1405 static void set_object_image_relative(GabeditXYPlot *xyplot, XYPlotObjectImage* objectImage)
1406 {
1407 gdouble f = (gdouble)GTK_WIDGET(xyplot)->allocation.width;
1408 gint xi=objectImage->xi-xyplot->plotting_rect.x;
1409 gint yi=xyplot->plotting_rect.y+xyplot->plotting_rect.height-objectImage->yi;
1410 if(f>(gdouble)GTK_WIDGET(xyplot)->allocation.height) f = (gdouble)GTK_WIDGET(xyplot)->allocation.height;
1411 objectImage->width = (gdouble)objectImage->widthi/f;
1412 objectImage->height = (gdouble)objectImage->heighti/f;
1413 /*
1414 objectImage->x = (gdouble)objectImage->xi/f;
1415 objectImage->y = (gdouble)objectImage->yi/f;
1416 */
1417 pixel2value(xyplot, xi, yi, &objectImage->x, &objectImage->y);
1418 /* printf("xy = %f %f\n",objectImage->x, objectImage->y);*/
1419 }
1420 /**************************************************************************************************/
set_object_image_pixels(GabeditXYPlot * xyplot,XYPlotObjectImage * objectImage)1421 static void set_object_image_pixels(GabeditXYPlot *xyplot, XYPlotObjectImage* objectImage)
1422 {
1423 gint xi,yi;
1424 gdouble f = (gdouble)GTK_WIDGET(xyplot)->allocation.width;
1425 if(f>(gdouble)GTK_WIDGET(xyplot)->allocation.height) f = (gdouble)GTK_WIDGET(xyplot)->allocation.height;
1426 objectImage->widthi = (gint)(objectImage->width*f);
1427 objectImage->heighti = (gint)(objectImage->height*f);
1428 /*
1429 objectImage->xi = (gint)(objectImage->x*f);
1430 objectImage->yi = (gint)(objectImage->y*f);
1431 */
1432
1433 value2pixel(xyplot, objectImage->x, objectImage->y, &xi, &yi);
1434 objectImage->xi = xi;
1435 objectImage->yi = yi;
1436 objectImage->yi=xyplot->plotting_rect.height-objectImage->yi;
1437 objectImage->xi += xyplot->plotting_rect.x;
1438 objectImage->yi += xyplot->plotting_rect.y;
1439 }
1440 /****************************************************************************************/
set_object_image(GabeditXYPlot * xyplot,XYPlotObjectImage * objectImage,gint xi,gint yi,gint w,gint h)1441 static void set_object_image(GabeditXYPlot *xyplot, XYPlotObjectImage* objectImage, gint xi, gint yi, gint w, gint h)
1442 {
1443 objectImage->xi = xi;
1444 objectImage->yi = yi;
1445 objectImage->widthi = w;
1446 objectImage->heighti = h;
1447 set_object_image_relative(xyplot, objectImage);
1448 }
1449 /**************************************************************************/
get_image_from_clipboard()1450 static cairo_surface_t* get_image_from_clipboard()
1451 {
1452 cairo_surface_t *surface = NULL;
1453 GtkClipboard * clipboard = NULL;
1454 GdkPixbuf * pixbuf = NULL;
1455
1456 clipboard = gtk_clipboard_get(GDK_SELECTION_CLIPBOARD);
1457 if(!clipboard) return NULL;
1458 pixbuf = gtk_clipboard_wait_for_image(clipboard);
1459
1460 if(pixbuf)
1461 {
1462 gint width;
1463 gint height;
1464 gint stride;
1465 gint x,y;
1466 gint nChannels;
1467 guchar *p, *pixels;
1468 gint red, green, blue;
1469 gfloat alpha;
1470
1471 if (!gdk_pixbuf_get_has_alpha (pixbuf))
1472 {
1473 GdkPixbuf* newPixbuf = gdk_pixbuf_add_alpha (pixbuf, FALSE, 255, 255, 255);
1474 if (newPixbuf != pixbuf)
1475 {
1476 g_object_unref(pixbuf);
1477 pixbuf = newPixbuf;
1478 }
1479 }
1480 width = gdk_pixbuf_get_width (pixbuf);
1481 height = gdk_pixbuf_get_height (pixbuf);
1482 stride = gdk_pixbuf_get_rowstride(pixbuf);
1483 nChannels = gdk_pixbuf_get_n_channels (pixbuf);
1484 pixels = gdk_pixbuf_get_pixels (pixbuf);
1485
1486 for (y = 0; y < height; y++)
1487 {
1488 for (x = 0; x < width; x++)
1489 {
1490 p = pixels + y * stride + x * nChannels;
1491 alpha = (gfloat) p[3] / 255;
1492 red = p[0] * alpha;
1493 green = p[1] * alpha;
1494 blue = p[2] * alpha;
1495 p[0] = blue;
1496 p[1] = green;
1497 p[2] = red;
1498 }
1499 }
1500
1501 surface = cairo_image_surface_create_for_data(
1502 pixels,
1503 CAIRO_FORMAT_ARGB32,
1504 width,
1505 height,
1506 stride);
1507 /*g_object_unref(pixbuf);*/
1508 }
1509 return surface;
1510 }
1511 /**************************************************************************************************/
get_object_image(GabeditXYPlot * xyplot,gint xi,gint yi,G_CONST_RETURN gchar * fileName)1512 static XYPlotObjectImage get_object_image(GabeditXYPlot *xyplot, gint xi, gint yi, G_CONST_RETURN gchar* fileName)
1513 {
1514 gint w;
1515 gint h;
1516 gint nw;
1517 gint nh;
1518 gdouble fw = 1;
1519 gdouble fh = 1;
1520 gdouble f = 1;
1521 XYPlotObjectImage objectImage;
1522 objectImage.widthi=0;
1523 objectImage.heighti=0;
1524 objectImage.xi=xi;
1525 objectImage.yi=yi;
1526 if(fileName) objectImage.fileName = g_strdup(fileName);
1527 else objectImage.fileName = NULL;
1528 objectImage.image=NULL;
1529 if(fileName)
1530 {
1531 objectImage.image = cairo_image_surface_create_from_png (objectImage.fileName);
1532 }
1533 else
1534 {
1535 objectImage.image = get_image_from_clipboard();
1536 }
1537 if(!objectImage.image) return objectImage;
1538 w = cairo_image_surface_get_width (objectImage.image);
1539 h = cairo_image_surface_get_height (objectImage.image);
1540
1541 nw = xyplot->plotting_rect.width-xi;
1542 nh = xyplot->plotting_rect.height-yi;
1543 if(nw<w && nw>0) fw = nw/(gdouble)w;
1544 if(nh<h&&nh>0) fh = nh/(gdouble)h;
1545 f = fw;
1546 if(f>fh) f = fh;
1547
1548 objectImage.widthi = (gint)(w*f);
1549 objectImage.heighti = (gint)(h*f);
1550 set_object_image_relative(xyplot, &objectImage);
1551
1552 /* printf("w = %d h = %d\n",w, h);*/
1553 return objectImage;
1554 }
1555 /****************************************************************************************/
add_object_image(GabeditXYPlot * xyplot,gint xi,gint yi,gint width,gint height,G_CONST_RETURN gchar * fileName)1556 static void add_object_image(GabeditXYPlot *xyplot, gint xi, gint yi, gint width, gint height, G_CONST_RETURN gchar* fileName)
1557 {
1558 XYPlotObjectImage objectImage = get_object_image(xyplot, xi, yi, fileName);
1559 if(!objectImage.image) return;
1560 xyplot->nObjectsImage++;
1561 if(xyplot->nObjectsImage==1) xyplot->objectsImage = g_malloc(sizeof(XYPlotObjectImage));
1562 else xyplot->objectsImage = g_realloc(xyplot->objectsImage,xyplot->nObjectsImage*sizeof(XYPlotObjectImage));
1563 if(width>0 && height>0)
1564 {
1565 objectImage.widthi=width;
1566 objectImage.heighti=height;
1567 }
1568 xyplot->objectsImage[xyplot->nObjectsImage-1] = objectImage;
1569 }
1570 /****************************************************************************************/
get_object_image_num(GabeditXYPlot * xyplot,gint xi,gint yi)1571 static gint get_object_image_num(GabeditXYPlot *xyplot, gint xi, gint yi)
1572 {
1573 gint i;
1574 if(!xyplot) return -1;
1575 for(i=0;i<xyplot->nObjectsImage;i++)
1576 {
1577 if(xi>=(gint)xyplot->objectsImage[i].xi && yi>=xyplot->objectsImage[i].yi
1578 && xi<=xyplot->objectsImage[i].xi+xyplot->objectsImage[i].widthi
1579 && yi<=xyplot->objectsImage[i].yi+xyplot->objectsImage[i].heighti)
1580 return i;
1581 }
1582 return -1;
1583 }
1584 /****************************************************************************************/
delete_object_image(GtkWidget * widget,gint i)1585 static void delete_object_image(GtkWidget *widget, gint i)
1586 {
1587 gint j;
1588 GabeditXYPlot *xyplot = NULL;
1589 if(!widget) return;
1590 if(!GTK_IS_WIDGET(widget)) return;
1591 xyplot = GABEDIT_XYPLOT(widget);
1592 if(i<0||i>=xyplot->nObjectsImage) return;
1593 if(xyplot->objectsImage[i].fileName) g_free(xyplot->objectsImage[i].fileName);
1594 if(xyplot->objectsImage[i].image) cairo_surface_destroy (xyplot->objectsImage[i].image);
1595 for(j=i;j<xyplot->nObjectsImage-1;j++)
1596 xyplot->objectsImage[j] = xyplot->objectsImage[j+1];
1597 xyplot->nObjectsImage--;
1598 if(xyplot->nObjectsImage<1)
1599 {
1600 xyplot->nObjectsImage = 0;
1601 if(xyplot->objectsImage) g_free(xyplot->objectsImage);
1602 xyplot->objectsImage = NULL;
1603 }
1604 else
1605 {
1606 xyplot->objectsImage = g_realloc(xyplot->objectsImage,xyplot->nObjectsImage*sizeof(XYPlotObjectImage));
1607 }
1608
1609 }
1610 /****************************************************************************************/
delete_objects_image(GtkWidget * widget)1611 static void delete_objects_image(GtkWidget *widget)
1612 {
1613 GabeditXYPlot *xyplot = NULL;
1614 gint i;
1615 if(!widget) return;
1616 if(!GTK_IS_WIDGET(widget)) return;
1617 xyplot = GABEDIT_XYPLOT(widget);
1618 for(i=0;i<xyplot->nObjectsImage;i++)
1619 {
1620 if(xyplot->objectsImage[i].fileName) g_free(xyplot->objectsImage[i].fileName);
1621 if(xyplot->objectsImage[i].image) cairo_surface_destroy (xyplot->objectsImage[i].image);
1622 }
1623 xyplot->nObjectsImage = 0;
1624 if(xyplot->objectsImage) g_free(xyplot->objectsImage);
1625 xyplot->objectsImage = NULL;
1626 gtk_widget_queue_draw(GTK_WIDGET(xyplot));
1627 }
1628 /********************************************************************************/
read_image_png(GtkFileChooser * filesel,gint response_id)1629 static gboolean read_image_png(GtkFileChooser *filesel, gint response_id)
1630 {
1631 gchar *fileName;
1632 GtkWidget* xyplot = NULL;
1633 XYPlotObjectImage* objectImage = NULL;
1634
1635 if(response_id != GTK_RESPONSE_OK) return FALSE;
1636 fileName = gtk_file_chooser_get_filename(filesel);
1637 xyplot = g_object_get_data(G_OBJECT (filesel), "XYPLOT");
1638 objectImage = g_object_get_data(G_OBJECT(filesel),"ObjectImage");
1639 if(objectImage && !objectImage->image)
1640 {
1641 add_object_image(GABEDIT_XYPLOT(xyplot), objectImage->xi, objectImage->yi, -1, -1, fileName);
1642 g_free(objectImage);
1643 }
1644 gtk_widget_queue_draw(GTK_WIDGET(xyplot));
1645 return TRUE;
1646
1647 }
1648 /********************************************************************************/
activate_entry_object_image(GtkWidget * entry,gpointer user_data)1649 static void activate_entry_object_image(GtkWidget *entry, gpointer user_data)
1650 {
1651 G_CONST_RETURN gchar* t;
1652 GtkWidget* xyplot = NULL;
1653 GtkWidget* window = NULL;
1654 XYPlotObjectImage* objectImage = NULL;
1655
1656
1657 if(!GTK_IS_WIDGET(entry)) return;
1658 if(!user_data || !G_IS_OBJECT(user_data)) return;
1659
1660 xyplot = GTK_WIDGET(user_data);
1661 t= gtk_entry_get_text(GTK_ENTRY(entry));
1662 if(!entry) return;
1663 window = g_object_get_data(G_OBJECT(entry),"Window");
1664 objectImage = g_object_get_data(G_OBJECT(entry),"ObjectImage");
1665 /* t is destroyed with window */
1666 if(!objectImage)
1667 {
1668 if(window)gtk_widget_destroy(window);
1669 return;
1670 }
1671 else
1672 {
1673 objectImage->widthi =(gint)(fabs(atof(t))*cairo_image_surface_get_width (objectImage->image));
1674 objectImage->heighti =(gint)(fabs(atof(t))*cairo_image_surface_get_height (objectImage->image));
1675 }
1676 if(window)gtk_widget_destroy(window);
1677 gtk_widget_queue_draw(GTK_WIDGET(xyplot));
1678 }
1679 /********************************************************************************/
add_set_object_image_dialog(GtkWidget * xyplot,gint i,gint xi,gint yi)1680 static void add_set_object_image_dialog(GtkWidget* xyplot, gint i, gint xi, gint yi)
1681 {
1682 GtkWidget* parentWindow = NULL;
1683 gchar* patternsfiles[] = {"*.png","*",NULL};
1684 GtkWidget* filesel= NULL;
1685 XYPlotObjectImage* objectImage = NULL;
1686
1687 if(i>-1 && i<GABEDIT_XYPLOT(xyplot)->nObjectsImage)
1688 {
1689 GtkWidget* window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1690 GtkWidget* frame = NULL;
1691 GtkWidget* hbox = NULL;
1692 GtkWidget* vbox_frame = NULL;
1693 GtkWidget* label = NULL;
1694 GtkWidget* entry_label = NULL;
1695
1696 objectImage = &GABEDIT_XYPLOT(xyplot)->objectsImage[i];
1697
1698 gtk_window_set_title (GTK_WINDOW (window), _("Scale image"));
1699 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
1700 gtk_window_set_modal (GTK_WINDOW (window), TRUE);
1701
1702 g_signal_connect(G_OBJECT(window), "delete_event", G_CALLBACK(gtk_widget_destroy), (gpointer)xyplot);
1703
1704 hbox=gtk_hbox_new(FALSE, 0);
1705 gtk_container_add(GTK_CONTAINER(window), hbox);
1706 gtk_widget_show(hbox);
1707
1708 frame=gtk_frame_new(NULL);
1709 gtk_container_add(GTK_CONTAINER(hbox), frame);
1710 gtk_widget_show(frame);
1711
1712 vbox_frame=gtk_vbox_new(FALSE, 0);
1713 gtk_container_add(GTK_CONTAINER(frame), vbox_frame);
1714 gtk_widget_show(vbox_frame);
1715
1716 hbox=gtk_hbox_new(FALSE, 0);
1717 gtk_box_pack_start(GTK_BOX(vbox_frame), hbox, FALSE, FALSE, 2);
1718 gtk_widget_show(hbox);
1719
1720 label=gtk_label_new(_("Factor (new size/orginal size) : "));
1721 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 2);
1722 gtk_widget_show(label);
1723
1724 entry_label = gtk_entry_new();
1725 /* gtk_widget_set_size_request(entry_label,100,-1);*/
1726
1727 gtk_entry_set_text(GTK_ENTRY(entry_label),"0.5");
1728
1729 gtk_box_pack_start(GTK_BOX(hbox), entry_label, TRUE, TRUE, 2);
1730 gtk_widget_show(entry_label);
1731
1732 g_object_set_data(G_OBJECT(entry_label),"ObjectImage", objectImage);
1733
1734 g_object_set_data(G_OBJECT(entry_label),"Window", window);
1735 g_signal_connect (G_OBJECT (entry_label), "activate", (GCallback)activate_entry_object_image, xyplot);
1736
1737 parentWindow = get_parent_window(GTK_WIDGET(xyplot));
1738 if(parentWindow)
1739 {
1740 gtk_window_set_transient_for(GTK_WINDOW(window),GTK_WINDOW(parentWindow));
1741 }
1742 gtk_widget_show(window);
1743 }
1744 else if(i==-1)
1745 {
1746 objectImage = g_malloc(sizeof(XYPlotObjectImage));
1747 objectImage->xi = xi;
1748 objectImage->yi = yi;
1749 objectImage->fileName = NULL;
1750 objectImage->image = NULL;
1751 parentWindow = get_parent_window(GTK_WIDGET(xyplot));
1752 filesel= new_file_chooser_open(parentWindow,
1753 (GCallback *)read_image_png,
1754 _("Read image from a png file"),
1755 patternsfiles);
1756 gtk_window_set_modal (GTK_WINDOW (filesel), TRUE);
1757 g_object_set_data(G_OBJECT (filesel), "XYPLOT", xyplot);
1758 g_object_set_data(G_OBJECT(filesel),"ObjectImage", objectImage);
1759 }
1760 else
1761 add_object_image(GABEDIT_XYPLOT(xyplot), xi, yi, -1, -1, NULL);
1762
1763 }
1764 /****************************************************************************************/
reset_object_image_pixels(GabeditXYPlot * xyplot)1765 static void reset_object_image_pixels(GabeditXYPlot *xyplot)
1766 {
1767 gint i;
1768 if(!xyplot) return;
1769 for(i=0;i<xyplot->nObjectsImage;i++)
1770 set_object_image_pixels(xyplot, &xyplot->objectsImage[i]);
1771 }
1772 /****************************************************************************************/
1773 /*
1774 static void reset_object_image_relative(GabeditXYPlot *xyplot)
1775 {
1776 gint i;
1777 if(!xyplot) return;
1778 for(i=0;i<xyplot->nObjectsImage;i++)
1779 set_object_image_relative(xyplot, &xyplot->objectsImage[i]);
1780 }
1781 */
1782 /****************************************************************************************/
insert_objects_image_from_clipboard(GtkWidget * widget)1783 static void insert_objects_image_from_clipboard(GtkWidget *widget)
1784 {
1785 if(!widget) return;
1786 if(!GTK_IS_WIDGET(widget)) return;
1787 add_object_image(GABEDIT_XYPLOT(widget), 0, 0, -1, -1, NULL);
1788 gtk_widget_queue_draw(widget);
1789 }
1790 /****************************************************************************************/
begin_insert_objects_image(GtkWidget * widget)1791 static void begin_insert_objects_image(GtkWidget *widget)
1792 {
1793 if(!widget) return;
1794 if(!GTK_IS_WIDGET(widget)) return;
1795 GABEDIT_XYPLOT(widget)->i_key_pressed = TRUE;
1796 }
1797 /********************************************************************************/
my_strsplit(gchar * str)1798 static gchar** my_strsplit(gchar *str)
1799 {
1800 gchar** strsplit= g_malloc(sizeof(gchar*));
1801 gint n=0;
1802 gchar* t=str;
1803 gchar p[BSIZE];
1804 while(*t!='\n' && *t !='\0')
1805 {
1806 if(*t!=' ')
1807 {
1808 n++;
1809 strsplit= g_realloc(strsplit,(n+1)*sizeof(gchar*));
1810 sscanf(t,"%s",p);
1811 strsplit[n-1]= g_strdup(p);
1812 while(*t!=' ')
1813 {
1814 t++;
1815 if(*t =='\n' || *t =='\0')
1816 break;
1817 }
1818
1819 }
1820 else
1821 {
1822 while(*t ==' ' )
1823 {
1824 t++;
1825 if(*t =='\n' || *t =='\0')
1826 break;
1827 }
1828 }
1829 }
1830 strsplit[n]= NULL;
1831 return strsplit;
1832 }
1833 /********************************************************************************/
read_data_xy1yncolumns(GtkFileChooser * filesel,gint response_id)1834 static gboolean read_data_xy1yncolumns(GtkFileChooser *filesel, gint response_id)
1835 {
1836 gchar *fileName;
1837 gchar t[BSIZE];
1838 FILE *fd;
1839 GtkWidget* xyplot = NULL;
1840 gchar** strsplit;
1841 gchar* str = NULL;
1842 gint* numberOfPoints = NULL;
1843 gdouble** X = NULL;
1844 gdouble** Y = NULL;
1845 gint nmax = 0;
1846 gint i;
1847 gint k;
1848 gdouble x=0;
1849 gboolean doPeaks = FALSE;
1850
1851 if(response_id != GTK_RESPONSE_OK) return FALSE;
1852 fileName = gtk_file_chooser_get_filename(filesel);
1853 xyplot = g_object_get_data(G_OBJECT (filesel), "XYPLOT");
1854 doPeaks = GPOINTER_TO_INT(g_object_get_data(G_OBJECT (filesel), "DoPeaks"));
1855
1856 fd = fopen(fileName, "rb");
1857
1858 if(fgets(t,BSIZE,fd) && strcmp(t,"\n"))
1859 {
1860 for(i=0;i<strlen(t);i++)
1861 {
1862 if(t[i]==',')t[i]=' ';
1863 if(t[i]=='\t')t[i]=' ';
1864 }
1865 strsplit = my_strsplit(t);
1866 while(strsplit && strsplit[nmax]) nmax++;
1867 nmax--;
1868 if(nmax>0)
1869 {
1870 Y = g_malloc(nmax*sizeof(gdouble*));
1871 X = g_malloc(nmax*sizeof(gdouble*));
1872 numberOfPoints = g_malloc(nmax*sizeof(gint));
1873 for(k=0;k<nmax;k++)
1874 {
1875 numberOfPoints[k] = 1;
1876 X[k] = g_malloc(1*sizeof(gdouble));
1877 X[k][0] = atof(strsplit[0]);
1878 Y[k] = g_malloc(1*sizeof(gdouble));
1879 Y[k][0] = atof(strsplit[k+1]);
1880 }
1881 }
1882 if(strsplit) g_strfreev(strsplit);
1883 }
1884 while(nmax>0 && !feof(fd))
1885 {
1886 if(!fgets(t,BSIZE,fd)) break;
1887 if(!strcmp(t,"\n")) break;
1888 for(i=0;i<strlen(t);i++)
1889 {
1890 if(t[i]==',')t[i]=' ';
1891 if(t[i]=='\t')t[i]=' ';
1892 }
1893 strsplit = my_strsplit(t);
1894 if(!strsplit) break;
1895 if(!strsplit[0]) break;
1896 if(!strsplit[1]) break;
1897 i = 0;
1898 do{
1899 str=strsplit[i];
1900 if(!str) break;
1901 i++;
1902 if(i==1) {
1903 x = atof(str);
1904 continue;
1905 }
1906 k = i-2;
1907 if(k>=nmax) break;
1908 numberOfPoints[k]++;
1909 X[k] = g_realloc(X[k], numberOfPoints[k]*sizeof(gdouble));
1910 Y[k] = g_realloc(Y[k], numberOfPoints[k]*sizeof(gdouble));
1911 X[k][numberOfPoints[k]-1] = x;
1912 Y[k][numberOfPoints[k]-1] = atof(str);
1913 }while(str!=NULL);
1914
1915 g_strfreev(strsplit);
1916 }
1917 if(nmax>0)
1918 {
1919 for(k=0;k<nmax;k++)
1920 {
1921 if(numberOfPoints[k]>0 && X[k] && Y[k])
1922 {
1923 if(doPeaks) add_new_data_peaks(xyplot, numberOfPoints[k], X[k], Y[k]);
1924 else add_new_data(xyplot, numberOfPoints[k], X[k], Y[k]);
1925 }
1926 if(X[k]) g_free(X[k]);
1927 if(Y[k]) g_free(Y[k]);
1928 }
1929 }
1930 else
1931 {
1932 GtkWidget* parentWidget = get_parent_window(GTK_WIDGET(xyplot));
1933 GtkWindow* parentWindow = NULL;
1934 if(parentWidget) parentWindow = GTK_WINDOW(parentWidget);
1935 GtkWidget* dialog = gtk_message_dialog_new (GTK_WINDOW(parentWindow),
1936 GTK_DIALOG_DESTROY_WITH_PARENT,
1937 GTK_MESSAGE_ERROR,
1938 GTK_BUTTONS_CLOSE,
1939 _("Error reading file '%s'"),
1940 fileName);
1941 gtk_dialog_run (GTK_DIALOG (dialog));
1942 gtk_widget_destroy (dialog);
1943 }
1944
1945 if(numberOfPoints) g_free(numberOfPoints);
1946 if(X) g_free(X);
1947 if(Y) g_free(Y);
1948 fclose(fd);
1949 return TRUE;
1950
1951 }
1952 /********************************************************************************/
read_data_xy1yncolumns_dlg(GtkWidget * xyplot,gboolean doPeaks)1953 static void read_data_xy1yncolumns_dlg(GtkWidget* xyplot, gboolean doPeaks)
1954 {
1955 GtkWidget* parentWindow = NULL;
1956 gchar* patternsfiles[] = {"*.txt","*",NULL};
1957 GtkWidget* filesel= NULL;
1958
1959 parentWindow = get_parent_window(GTK_WIDGET(xyplot));
1960 filesel= new_file_chooser_open(parentWindow,
1961 (GCallback *)read_data_xy1yncolumns,
1962 _("Read data from an ASCII X.Y1..Yn file(x, y1, y2,...,yn)"),
1963 patternsfiles);
1964 gtk_window_set_modal (GTK_WINDOW (filesel), TRUE);
1965 g_object_set_data(G_OBJECT (filesel), "XYPLOT", xyplot);
1966 g_object_set_data(G_OBJECT (filesel), "DoPeaks", GINT_TO_POINTER(doPeaks));
1967 }
1968 /********************************************************************************/
this_is_a_backspace(gchar * st)1969 static gboolean this_is_a_backspace(gchar *st)
1970 {
1971 gint i;
1972 for(i=0;i<(gint)strlen(st);i++)
1973 if(st[i] != ' ' && st[i] !='\n' && st[i] !='\r')
1974 return FALSE;
1975 return TRUE;
1976 }
1977 /********************************************************************************/
read_data_1column(GtkFileChooser * filesel,gint response_id)1978 static gboolean read_data_1column(GtkFileChooser *filesel, gint response_id)
1979 {
1980 gchar *fileName;
1981 gchar t[BSIZE];
1982 gboolean OK;
1983 FILE *fd;
1984 gint ne;
1985 gint numberOfPoints = 0;
1986 gdouble* X = NULL;
1987 gdouble* Y = NULL;
1988 gdouble a;
1989 gdouble b;
1990 GtkWidget* xyplot = NULL;
1991 gint nData= 0;
1992 gboolean doPeaks = FALSE;
1993
1994 if(response_id != GTK_RESPONSE_OK) return FALSE;
1995 fileName = gtk_file_chooser_get_filename(filesel);
1996 xyplot = g_object_get_data(G_OBJECT (filesel), "XYPLOT");
1997 doPeaks = GPOINTER_TO_INT(g_object_get_data(G_OBJECT (filesel), "DoPeaks"));
1998
1999 fd = fopen(fileName, "rb");
2000 OK=FALSE;
2001
2002 while(!feof(fd))
2003 {
2004 if(!fgets(t,BSIZE,fd)) break;
2005 if(this_is_a_backspace(t))
2006 {
2007 if(numberOfPoints==0) continue;
2008 add_new_data(xyplot, numberOfPoints, X, Y);
2009 numberOfPoints = 0;
2010 if(X) g_free(X);
2011 if(Y) g_free(Y);
2012 X = NULL;
2013 Y = NULL;
2014 nData ++;
2015 }
2016 ne = sscanf(t,"%lf",&b);
2017 if(ne==1)
2018 {
2019 numberOfPoints++;
2020 a = numberOfPoints;
2021 X = g_realloc(X, numberOfPoints*sizeof(gdouble));
2022 Y = g_realloc(Y, numberOfPoints*sizeof(gdouble));
2023 X[numberOfPoints-1] = a;
2024 Y[numberOfPoints-1] = b;
2025 }
2026 }
2027 if(numberOfPoints>0)
2028 {
2029 if(doPeaks) add_new_data_peaks(xyplot, numberOfPoints, X, Y);
2030 else add_new_data(xyplot, numberOfPoints, X, Y);
2031 }
2032 else if(nData == 0)
2033 {
2034 GtkWidget* parentWidget = get_parent_window(GTK_WIDGET(xyplot));
2035 GtkWindow* parentWindow = NULL;
2036 if(parentWidget) parentWindow = GTK_WINDOW(parentWidget);
2037 GtkWidget* dialog = gtk_message_dialog_new (GTK_WINDOW(parentWindow),
2038 GTK_DIALOG_DESTROY_WITH_PARENT,
2039 GTK_MESSAGE_ERROR,
2040 GTK_BUTTONS_CLOSE,
2041 _("Error reading file '%s'"),
2042 fileName);
2043 gtk_dialog_run (GTK_DIALOG (dialog));
2044 gtk_widget_destroy (dialog);
2045 }
2046
2047 if(X) g_free(X);
2048 if(Y) g_free(Y);
2049 fclose(fd);
2050 return TRUE;
2051
2052 }
2053 /********************************************************************************/
read_data_1column_dlg(GtkWidget * xyplot,gboolean doPeaks)2054 static void read_data_1column_dlg(GtkWidget* xyplot, gboolean doPeaks)
2055 {
2056 GtkWidget* parentWindow = NULL;
2057 gchar* patternsfiles[] = {"*.txt","*",NULL};
2058 GtkWidget* filesel= NULL;
2059
2060 parentWindow = get_parent_window(GTK_WIDGET(xyplot));
2061 filesel= new_file_chooser_open(parentWindow,
2062 (GCallback *)read_data_1column,
2063 _("Read data from an ASCII Y file(1 column(Y), X=#ligne)"),
2064 patternsfiles);
2065 gtk_window_set_modal (GTK_WINDOW (filesel), TRUE);
2066 g_object_set_data(G_OBJECT (filesel), "XYPLOT", xyplot);
2067 g_object_set_data(G_OBJECT (filesel), "DoPeaks", GINT_TO_POINTER(doPeaks));
2068 }
2069 /********************************************************************************/
read_data_2columns(GtkFileChooser * filesel,gint response_id)2070 static gboolean read_data_2columns(GtkFileChooser *filesel, gint response_id)
2071 {
2072 gchar *fileName;
2073 gchar t[BSIZE];
2074 gboolean OK;
2075 FILE *fd;
2076 gint ne;
2077 gint numberOfPoints = 0;
2078 gdouble* X = NULL;
2079 gdouble* Y = NULL;
2080 gdouble a;
2081 gdouble b;
2082 GtkWidget* xyplot = NULL;
2083 gint nData= 0;
2084 gboolean doPeaks = FALSE;
2085
2086 if(response_id != GTK_RESPONSE_OK) return FALSE;
2087 fileName = gtk_file_chooser_get_filename(filesel);
2088 xyplot = g_object_get_data(G_OBJECT (filesel), "XYPLOT");
2089 doPeaks = GPOINTER_TO_INT(g_object_get_data(G_OBJECT (filesel), "DoPeaks"));
2090
2091 fd = fopen(fileName, "rb");
2092 OK=FALSE;
2093
2094 while(!feof(fd))
2095 {
2096 if(!fgets(t,BSIZE,fd)) break;
2097 if(this_is_a_backspace(t))
2098 {
2099 if(numberOfPoints==0) continue;
2100 add_new_data(xyplot, numberOfPoints, X, Y);
2101 numberOfPoints = 0;
2102 if(X) g_free(X);
2103 if(Y) g_free(Y);
2104 X = NULL;
2105 Y = NULL;
2106 nData ++;
2107 }
2108 ne = sscanf(t,"%lf %lf",&a, &b);
2109 if(ne==2)
2110 {
2111 numberOfPoints++;
2112 X = g_realloc(X, numberOfPoints*sizeof(gdouble));
2113 Y = g_realloc(Y, numberOfPoints*sizeof(gdouble));
2114 X[numberOfPoints-1] = a;
2115 Y[numberOfPoints-1] = b;
2116 }
2117 }
2118 if(numberOfPoints>0)
2119 {
2120 if(doPeaks) add_new_data_peaks(xyplot, numberOfPoints, X, Y);
2121 else add_new_data(xyplot, numberOfPoints, X, Y);
2122 }
2123 else if(nData == 0)
2124 {
2125 GtkWidget* parentWidget = get_parent_window(GTK_WIDGET(xyplot));
2126 GtkWindow* parentWindow = NULL;
2127 if(parentWidget) parentWindow = GTK_WINDOW(parentWidget);
2128 GtkWidget* dialog = gtk_message_dialog_new (GTK_WINDOW(parentWindow),
2129 GTK_DIALOG_DESTROY_WITH_PARENT,
2130 GTK_MESSAGE_ERROR,
2131 GTK_BUTTONS_CLOSE,
2132 _("Error reading file '%s'"),
2133 fileName);
2134 gtk_dialog_run (GTK_DIALOG (dialog));
2135 gtk_widget_destroy (dialog);
2136 }
2137
2138 if(X) g_free(X);
2139 if(Y) g_free(Y);
2140 fclose(fd);
2141 return TRUE;
2142
2143 }
2144 /********************************************************************************/
read_data_2columns_dlg(GtkWidget * xyplot,gboolean doPeaks)2145 static void read_data_2columns_dlg(GtkWidget* xyplot, gboolean doPeaks)
2146 {
2147 GtkWidget* parentWindow = NULL;
2148 gchar* patternsfiles[] = {"*.txt","*",NULL};
2149 GtkWidget* filesel= NULL;
2150
2151 parentWindow = get_parent_window(GTK_WIDGET(xyplot));
2152 filesel= new_file_chooser_open(parentWindow,
2153 (GCallback *)read_data_2columns,
2154 _("Read data from an ASCII XY file(2 columns)"),
2155 patternsfiles);
2156 gtk_window_set_modal (GTK_WINDOW (filesel), TRUE);
2157 g_object_set_data(G_OBJECT (filesel), "XYPLOT", xyplot);
2158 g_object_set_data(G_OBJECT (filesel), "DoPeaks", GINT_TO_POINTER(doPeaks));
2159 }
2160 /********************************************************************************/
save_data_2columns(GtkFileChooser * filesel,gint response_id)2161 static gboolean save_data_2columns(GtkFileChooser *filesel, gint response_id)
2162 {
2163 gchar *fileName;
2164 FILE *file;
2165 XYPlotData* data = NULL;
2166 gint loop;
2167
2168 if(response_id != GTK_RESPONSE_OK) return FALSE;
2169 fileName = gtk_file_chooser_get_filename(filesel);
2170 data = g_object_get_data(G_OBJECT (filesel), "CurentData");
2171 if(!data) return FALSE;
2172
2173 file = fopen(fileName, "w");
2174
2175 for(loop=0;loop<data->size; loop++)
2176 {
2177 fprintf(file, "%f %f\n",data->x[loop], data->y[loop]);
2178 }
2179 fclose(file);
2180 return TRUE;
2181
2182 }
2183 /********************************************************************************/
save_all_data_2columns(GtkFileChooser * filesel,gint response_id)2184 static gboolean save_all_data_2columns(GtkFileChooser *filesel, gint response_id)
2185 {
2186 gchar *fileName;
2187 FILE *file;
2188 XYPlotData* data = NULL;
2189 gint loop;
2190 GList *current = NULL;
2191 GList *data_list = NULL;
2192
2193 if(response_id != GTK_RESPONSE_OK) return FALSE;
2194 fileName = gtk_file_chooser_get_filename(filesel);
2195
2196 data_list = g_object_get_data(G_OBJECT (filesel), "DataList");
2197
2198
2199 file = fopen(fileName, "w");
2200
2201 if(data_list)
2202 for(current=g_list_first(data_list); current!=NULL; current=current->next)
2203 {
2204 data=(XYPlotData*)current->data;
2205 if(!data) continue;
2206 for(loop=0;loop<data->size; loop++)
2207 fprintf(file, "%f %f\n",data->x[loop], data->y[loop]);
2208 fprintf(file, "\n");
2209 }
2210 fclose(file);
2211 return TRUE;
2212
2213 }
2214 /********************************************************************************/
get_data_jdx_type(FILE * fd,gdouble * scaleX,gdouble * scaleY,gdouble * deltaX)2215 static gint get_data_jdx_type(FILE* fd, gdouble* scaleX, gdouble* scaleY, gdouble* deltaX)
2216 {
2217 gchar t[BSIZE];
2218 *scaleX = 1;
2219 *scaleY = 1;
2220 *deltaX = 0;
2221 while(!feof(fd))
2222 {
2223 if(!fgets(t,BSIZE,fd)) break;
2224 if(strstr(t,"##XFACTOR="))
2225 {
2226 gchar* e = strstr(t,"=")+1;
2227 if(e) *scaleX = atof(e);
2228 }
2229 if(strstr(t,"##YFACTOR="))
2230 {
2231 gchar* e = strstr(t,"=")+1;
2232 if(e) *scaleY = atof(e);
2233 }
2234 if(strstr(t,"##DELTAX="))
2235 {
2236 gchar* e = strstr(t,"=")+1;
2237 if(e) *deltaX = atof(e);
2238 }
2239 if(strstr(t,"##XYDATA="))
2240 {
2241 return JDX_TYPE_XYDATA;
2242 }
2243 if(strstr(t,"##XYPOINTS="))
2244 {
2245 return JDX_TYPE_XYPOINTS;
2246 }
2247 if(strstr(t,"##PEAK TABLE=") || strstr(t,"##PEAKTABLE="))
2248 {
2249 return JDX_TYPE_XYTABLE;
2250 }
2251 }
2252 return JDX_TYPE_UNKNOWN;
2253
2254 }
2255 /********************************************************************************/
read_data_jdx_xypoints(FILE * fd,GtkWidget * xyplot,gdouble scaleX,gdouble scaleY,gchar * fileName)2256 static gboolean read_data_jdx_xypoints(FILE* fd, GtkWidget*xyplot, gdouble scaleX, gdouble scaleY, gchar* fileName )
2257 {
2258 gchar t[BSIZE];
2259 gint numberOfPoints = 0;
2260 gdouble* X = NULL;
2261 gdouble* Y = NULL;
2262 gchar** strsplit;
2263 gchar* str1 = NULL;
2264 gchar* str2 = NULL;
2265 gint i;
2266
2267 while(!feof(fd))
2268 {
2269 if(!fgets(t,BSIZE,fd)) break;
2270 if(!strcmp(t,"\n")) break;
2271 if(strstr(t,"##END")) break;
2272 for(i=0;i<strlen(t);i++)
2273 {
2274 if(t[i]==',')t[i]=' ';
2275 if(t[i]=='\t')t[i]=' ';
2276 }
2277 strsplit = my_strsplit(t);
2278 if(!strsplit) break;
2279 if(!strsplit[0]) break;
2280 if(!strsplit[1]) break;
2281 i = 0;
2282 do{
2283 str1=strsplit[i];
2284 if(!str1) break;
2285 str2=strsplit[i+1];
2286 if(!str2) break;
2287 i++;
2288 numberOfPoints++;
2289 X = g_realloc(X, numberOfPoints*sizeof(gdouble));
2290 Y = g_realloc(Y, numberOfPoints*sizeof(gdouble));
2291 X[numberOfPoints-1] = atof(str1)*scaleX;
2292 Y[numberOfPoints-1] = atof(str2)*scaleY;
2293 }while(str2!=NULL);
2294
2295 g_strfreev(strsplit);
2296 }
2297 if(numberOfPoints>0)
2298 {
2299 add_new_data(xyplot, numberOfPoints, X, Y);
2300 }
2301 else
2302 {
2303 GtkWidget* parentWidget = get_parent_window(GTK_WIDGET(xyplot));
2304 GtkWindow* parentWindow = NULL;
2305 if(parentWidget) parentWindow = GTK_WINDOW(parentWidget);
2306 GtkWidget* dialog = gtk_message_dialog_new (GTK_WINDOW(parentWindow),
2307 GTK_DIALOG_DESTROY_WITH_PARENT,
2308 GTK_MESSAGE_ERROR,
2309 GTK_BUTTONS_CLOSE,
2310 _("Error reading file '%s'"),
2311 fileName);
2312 gtk_dialog_run (GTK_DIALOG (dialog));
2313 gtk_widget_destroy (dialog);
2314 }
2315
2316 if(X) g_free(X);
2317 if(Y) g_free(Y);
2318 return TRUE;
2319
2320 }
2321 /********************************************************************************/
read_data_jdx_xydata(FILE * fd,GtkWidget * xyplot,gdouble scaleX,gdouble scaleY,gdouble deltaX,gchar * fileName)2322 static gboolean read_data_jdx_xydata(FILE* fd, GtkWidget*xyplot , gdouble scaleX, gdouble scaleY, gdouble deltaX , gchar* fileName)
2323 {
2324 gchar t[BSIZE];
2325 gint numberOfPoints = 0;
2326 gdouble* X = NULL;
2327 gdouble* Y = NULL;
2328 gchar** strsplit;
2329 gchar* str = NULL;
2330 gdouble x=0;
2331 gint i;
2332
2333 while(!feof(fd))
2334 {
2335 if(!fgets(t,BSIZE,fd)) break;
2336 if(!strcmp(t,"\n")) break;
2337 if(strstr(t,"##END")) break;
2338 for(i=0;i<strlen(t);i++)
2339 {
2340 if(t[i]==',')t[i]=' ';
2341 if(t[i]=='\t')t[i]=' ';
2342 }
2343 strsplit = my_strsplit(t);
2344 if(!strsplit) break;
2345 if(!strsplit[0]) break;
2346 if(!strsplit[1]) break;
2347 i = 0;
2348 do{
2349 str=strsplit[i];
2350 if(!str) break;
2351 i++;
2352 if(i==1) {
2353 x = atof(str);
2354 continue;
2355 }
2356 if(i>2) x += deltaX;
2357 numberOfPoints++;
2358 X = g_realloc(X, numberOfPoints*sizeof(gdouble));
2359 Y = g_realloc(Y, numberOfPoints*sizeof(gdouble));
2360 X[numberOfPoints-1] = x*scaleX;
2361 Y[numberOfPoints-1] = atof(str)*scaleY;
2362 }while(str!=NULL);
2363
2364 g_strfreev(strsplit);
2365 }
2366 if(numberOfPoints>0)
2367 {
2368 add_new_data(xyplot, numberOfPoints, X, Y);
2369 }
2370 else
2371 {
2372 GtkWidget* parentWidget = get_parent_window(GTK_WIDGET(xyplot));
2373 GtkWindow* parentWindow = NULL;
2374 if(parentWidget) parentWindow = GTK_WINDOW(parentWidget);
2375 GtkWidget* dialog = gtk_message_dialog_new (GTK_WINDOW(parentWindow),
2376 GTK_DIALOG_DESTROY_WITH_PARENT,
2377 GTK_MESSAGE_ERROR,
2378 GTK_BUTTONS_CLOSE,
2379 _("Error reading file '%s'"),
2380 fileName);
2381 gtk_dialog_run (GTK_DIALOG (dialog));
2382 gtk_widget_destroy (dialog);
2383 }
2384
2385 if(X) g_free(X);
2386 if(Y) g_free(Y);
2387 return TRUE;
2388
2389 }
2390 /********************************************************************************/
read_data_jdx_xytable(FILE * fd,GtkWidget * xyplot,gdouble scaleX,gdouble scaleY,gchar * fileName)2391 static gboolean read_data_jdx_xytable(FILE* fd, GtkWidget*xyplot , gdouble scaleX, gdouble scaleY, gchar* fileName)
2392 {
2393 gchar t[BSIZE];
2394 gint numberOfPoints = 0;
2395 gdouble* X = NULL;
2396 gdouble* Y = NULL;
2397 gchar** strsplit;
2398 gchar* str = NULL;
2399 gdouble x=0;
2400 gint i;
2401
2402 while(!feof(fd))
2403 {
2404 if(!fgets(t,BSIZE,fd)) break;
2405 if(!strcmp(t,"\n")) break;
2406 if(strstr(t,"##END")) break;
2407 for(i=0;i<strlen(t);i++)
2408 {
2409 if(t[i]==',')t[i]=' ';
2410 if(t[i]=='\t')t[i]=' ';
2411 }
2412 strsplit = my_strsplit(t);
2413 if(!strsplit) break;
2414 if(!strsplit[0]) break;
2415 if(!strsplit[1]) break;
2416 i = 0;
2417 do{
2418 str=strsplit[i];
2419 if(!str) break;
2420 i++;
2421 if(i%2==1) x = atof(str);
2422 else
2423 {
2424 gint i0 = numberOfPoints;
2425 numberOfPoints += 3;
2426 X = g_realloc(X, numberOfPoints*sizeof(gdouble));
2427 Y = g_realloc(Y, numberOfPoints*sizeof(gdouble));
2428 X[i0] = x*scaleX;
2429 Y[i0] = 0;
2430 X[i0+1] = x*scaleX;
2431 Y[i0+1] = atof(str)*scaleY;
2432 X[i0+2] = x*scaleX;
2433 Y[i0+2] = 0;
2434 }
2435 }while(str!=NULL);
2436
2437 g_strfreev(strsplit);
2438 }
2439 if(numberOfPoints>0)
2440 {
2441 add_new_data(xyplot, numberOfPoints, X, Y);
2442 }
2443 else
2444 {
2445 GtkWidget* parentWidget = get_parent_window(GTK_WIDGET(xyplot));
2446 GtkWindow* parentWindow = NULL;
2447 if(parentWidget) parentWindow = GTK_WINDOW(parentWidget);
2448 GtkWidget* dialog = gtk_message_dialog_new (GTK_WINDOW(parentWindow),
2449 GTK_DIALOG_DESTROY_WITH_PARENT,
2450 GTK_MESSAGE_ERROR,
2451 GTK_BUTTONS_CLOSE,
2452 _("Error reading file '%s'"),
2453 fileName);
2454 gtk_dialog_run (GTK_DIALOG (dialog));
2455 gtk_widget_destroy (dialog);
2456 }
2457
2458 if(X) g_free(X);
2459 if(Y) g_free(Y);
2460 return TRUE;
2461
2462 }
2463 /********************************************************************************/
read_data_jdx(GtkFileChooser * filesel,gint response_id)2464 static gboolean read_data_jdx(GtkFileChooser *filesel, gint response_id)
2465 {
2466 gchar *fileName;
2467 FILE *fd;
2468 GtkWidget* xyplot = NULL;
2469 gint type = 0;
2470 gdouble scaleX;
2471 gdouble scaleY;
2472 gdouble deltaX;
2473
2474 if(response_id != GTK_RESPONSE_OK) return FALSE;
2475 fileName = gtk_file_chooser_get_filename(filesel);
2476 xyplot = g_object_get_data(G_OBJECT (filesel), "XYPLOT");
2477
2478 fd = fopen(fileName, "rb");
2479 type = get_data_jdx_type(fd, &scaleX, &scaleY, &deltaX);
2480 if(type==JDX_TYPE_XYPOINTS) read_data_jdx_xypoints(fd, xyplot, scaleX, scaleY, fileName);
2481 if(type==JDX_TYPE_XYDATA) read_data_jdx_xydata(fd,xyplot, scaleX, scaleY,deltaX, fileName);
2482 if(type==JDX_TYPE_XYTABLE) read_data_jdx_xytable(fd,xyplot, scaleX, scaleY, fileName);
2483 if(type==JDX_TYPE_UNKNOWN)
2484 {
2485 GtkWidget* parentWidget = get_parent_window(GTK_WIDGET(xyplot));
2486 GtkWindow* parentWindow = NULL;
2487 if(parentWidget) parentWindow = GTK_WINDOW(parentWidget);
2488 GtkWidget* dialog = gtk_message_dialog_new (GTK_WINDOW(parentWindow),
2489 GTK_DIALOG_DESTROY_WITH_PARENT,
2490 GTK_MESSAGE_ERROR,
2491 GTK_BUTTONS_CLOSE,
2492 _("Error reading file '%s', The type of data in this file is unknown"),
2493 fileName);
2494 gtk_dialog_run (GTK_DIALOG (dialog));
2495 gtk_widget_destroy (dialog);
2496 }
2497 fclose(fd);
2498 return TRUE;
2499
2500 }
2501 /********************************************************************************/
read_data_jdx_dlg(GtkWidget * xyplot)2502 static void read_data_jdx_dlg(GtkWidget* xyplot)
2503 {
2504 GtkWidget* parentWindow = NULL;
2505 gchar* patternsfiles[] = {"*.jdx","*",NULL};
2506 GtkWidget* filesel= NULL;
2507
2508 parentWindow = get_parent_window(GTK_WIDGET(xyplot));
2509 filesel= new_file_chooser_open(parentWindow,
2510 (GCallback *)read_data_jdx,
2511 _("Read data from a jdx file"),
2512 patternsfiles);
2513 gtk_window_set_modal (GTK_WINDOW (filesel), TRUE);
2514 g_object_set_data(G_OBJECT (filesel), "XYPLOT", xyplot);
2515 }
2516 /*************************************************************************************/
set_font(GtkWidget * view,gchar * fontname)2517 static void set_font (GtkWidget *view, gchar *fontname)
2518 {
2519 GtkStyle *style;
2520 PangoFontDescription *font_desc;
2521
2522 if(!GTK_IS_WIDGET(view)) return;
2523 style = gtk_style_copy (gtk_widget_get_style (view));
2524 font_desc = pango_font_description_from_string (fontname);
2525
2526 if (font_desc)
2527 {
2528 /*
2529 pango_font_description_free (style->font_desc);
2530 */
2531 style->font_desc = font_desc;
2532 }
2533
2534 gtk_widget_set_style (GTK_WIDGET(view), style);
2535
2536 g_object_unref (style);
2537 }
2538 /********************************************************************************/
create_popup_win(gchar * label)2539 static GtkWidget* create_popup_win(gchar* label)
2540 {
2541 GtkWidget *MainFrame;
2542 GtkWidget *Label;
2543 GtkWidget *hbox = gtk_hbox_new(0,FALSE);
2544
2545
2546 MainFrame = gtk_window_new (GTK_WINDOW_POPUP);
2547
2548 /* center it on the screen*/
2549 gtk_window_set_position(GTK_WINDOW (MainFrame), GTK_WIN_POS_MOUSE);
2550
2551 /* set up key and mound button press to hide splash screen*/
2552
2553 gtk_widget_add_events(MainFrame,
2554 GDK_BUTTON_PRESS_MASK|
2555 GDK_BUTTON_RELEASE_MASK|
2556 GDK_KEY_PRESS_MASK);
2557
2558 gtk_widget_realize(MainFrame);
2559 Label = gtk_label_new(label);
2560 gtk_label_set_justify(GTK_LABEL(Label),GTK_JUSTIFY_LEFT);
2561 set_font (Label,"helvetica bold 24");
2562 gtk_box_pack_start (GTK_BOX (hbox), Label, FALSE, FALSE, 0);
2563 gtk_widget_show(Label);
2564 gtk_widget_show(hbox);
2565 gtk_container_add (GTK_CONTAINER (MainFrame), hbox);
2566 gtk_widget_show(MainFrame);
2567
2568 /* force it to draw now.*/
2569 gdk_flush();
2570
2571 /* go into main loop, processing events.*/
2572 while(gtk_events_pending()) gtk_main_iteration();
2573 return MainFrame;
2574 }
2575 /****************************************************************************************/
build_fourier(GtkWidget * buttonDFT,gpointer user_data)2576 static void build_fourier(GtkWidget* buttonDFT, gpointer user_data)
2577 {
2578 if(user_data && G_IS_OBJECT(user_data))
2579 {
2580 gdouble scale = 1.0;
2581 gdouble temperature = 1.0;
2582 gdouble xmax = 6000.0;
2583 G_CONST_RETURN gchar* t;
2584 GtkWidget* xyplot = GTK_WIDGET(user_data);
2585 XYPlotData* data = g_object_get_data(G_OBJECT (xyplot), "CurentData");
2586 GtkWidget* parentWindow = ( GtkWidget*) g_object_get_data(G_OBJECT (buttonDFT), "ParentWindow");
2587 GtkWidget* entry_scale = ( GtkWidget*) g_object_get_data(G_OBJECT (xyplot), "Entry_scale");
2588 GtkWidget* entry_temperature = ( GtkWidget*) g_object_get_data(G_OBJECT (xyplot), "Entry_temperature");
2589 GtkWidget* entry_xmax = ( GtkWidget*) g_object_get_data(G_OBJECT (xyplot), "Entry_xmax");
2590 GtkWidget* popup = NULL;
2591 GtkComboBox *combo_correction = ( GtkComboBox*) g_object_get_data(G_OBJECT (xyplot), "ComboCorrection");
2592 GtkTreeIter iter;
2593 gchar* correction = NULL;
2594 GtkToggleButton *normalize_button = ( GtkToggleButton*) g_object_get_data(G_OBJECT (xyplot), "NormalizeDFTButton");
2595
2596 g_return_if_fail (GABEDIT_IS_XYPLOT (xyplot));
2597 g_return_if_fail (GTK_IS_ENTRY (entry_scale));
2598 g_return_if_fail (GTK_IS_ENTRY (entry_temperature));
2599 g_return_if_fail (GTK_IS_ENTRY (entry_xmax));
2600
2601 if(parentWindow) gtk_widget_hide (GTK_WIDGET(parentWindow));
2602 while(gtk_events_pending()) gtk_main_iteration();
2603 popup = create_popup_win(_("Please wait"));
2604
2605 t= gtk_entry_get_text(GTK_ENTRY(entry_scale));
2606 scale = atof(t);
2607 if(scale<1e-10) { printf("Warning I set scale to %f\n",1.0); scale = 1.0;}
2608 t= gtk_entry_get_text(GTK_ENTRY(entry_temperature));
2609 temperature = atof(t);
2610 if(temperature<1e-10) { printf("Warning I set temperature to %f\n",300.0); temperature = 300.0;}
2611 t= gtk_entry_get_text(GTK_ENTRY(entry_xmax));
2612 xmax = atof(t);
2613
2614 if (gtk_combo_box_get_active_iter (combo_correction, &iter))
2615 {
2616 GtkTreeModel* model = gtk_combo_box_get_model(combo_correction);
2617 gtk_tree_model_get (model, &iter, 0, &correction, -1);
2618 }
2619
2620 if(data && data->size>2)
2621 {
2622 gdouble* X = g_malloc(data->size*sizeof(gdouble));
2623 gdouble* Y = g_malloc(data->size*sizeof(gdouble));
2624 gint i;
2625 GtkWidget* window = NULL;
2626 GtkWidget* xyplot = NULL;
2627 int n = 0;
2628 gint N = data->size;
2629 gdouble* x = NULL;
2630 gdouble* y = NULL;
2631
2632 x = data->x;
2633 y = data->y;
2634 /*
2635 printf("dx1 %f\n", fabs((x[N-1]-x[0])/(N-1)));
2636 printf("dx2 %f\n", fabs(x[1]-x[0]));
2637 */
2638 if(fabs(fabs((x[N-1]-x[0])/(N-1))-fabs(x[1]-x[0]))>1e-10)
2639 {
2640 printf("x values are not linear. Linearisation of x\n");
2641 build_linear_x(data->x, data->y, data->size, &x, &y, N);
2642 }
2643
2644 for(i=0;i<N; i++)
2645 {
2646 gint k;
2647 double arg;
2648 X[i] = 0;
2649 Y[i] = 0;
2650 arg = 2.0 * M_PI * (double)i / (double)N;
2651 if(xmax>0 && i*1.0/N*scale/fabs((x[N-1]-x[0])/(N-1))>xmax) break;
2652 for (k=0;k<N;k++)
2653 {
2654 gdouble cosarg = cos(k * arg);
2655 gdouble sinarg = sin(k * arg);
2656 X[i] += (y[k] * cosarg);
2657 Y[i] += (y[k] * sinarg);
2658 }
2659 n++;
2660 }
2661 for(i=0;i<n; i++) Y[i] = sqrt( X[i]* X[i]+Y[i]*Y[i]);
2662 /* time in fs, freq in cm-1 */
2663 for(i=0;i<n; i++) X[i] = i*1.0/N*scale/fabs((x[N-1]-x[0])/(N-1));
2664 if(x && x!= data->x) g_free(x);
2665 if(y && y!=data->y) g_free(y);
2666 if(n>0) { X = g_realloc(X,n*sizeof(gdouble)); Y = g_realloc(Y,n*sizeof(gdouble));}
2667 if(correction)
2668 {
2669 /*gdouble conv = 1/scale*47992.36961128; 10^15Hz->Kelvin*/
2670 gdouble conv = 1.43877505;/* cm-1=>Kelvin*/
2671 gdouble fac = conv/temperature;
2672 gdouble fac2 = fac/2;
2673 if(strstr(correction,"Classic")) for(i=0;i<n; i++) Y[i] *= X[i]*(1-exp(-X[i]*fac));
2674 else if(strstr(correction,"Kubo")) for(i=0;i<n; i++) Y[i] *= X[i]*tanh(X[i]*fac2);
2675 else if(strstr(correction,"Harmonic")) for(i=0;i<n; i++) Y[i] *= X[i]*(X[i]*fac);
2676 else if(strstr(correction,"Schofield")) for(i=0;i<n; i++) Y[i] *= X[i]*(1-exp(-X[i]*fac))*exp(X[i]*fac2);
2677
2678 if(gtk_toggle_button_get_active(normalize_button))
2679 {
2680 gdouble norm = 0;
2681 for(i=0;i<n; i++) norm+=Y[i];
2682 if(norm==0) norm = 1;
2683 norm = 1.0/norm;
2684 for(i=0;i<n; i++) Y[i] *= norm;
2685 }
2686 }
2687
2688
2689 window = gabedit_xyplot_new_window(_("DFT"),NULL);
2690 xyplot = g_object_get_data(G_OBJECT (window), "XYPLOT");
2691 xyplot_curve_noconv(GABEDIT_XYPLOT(xyplot), n, X, Y, NULL);
2692 gabedit_xyplot_set_range_xmin (GABEDIT_XYPLOT(xyplot), 0.0);
2693 gabedit_xyplot_set_x_label (GABEDIT_XYPLOT(xyplot), "cm<sup>-1</sup>");
2694 }
2695 if(parentWindow) gtk_object_destroy (GTK_OBJECT(parentWindow));
2696 if(popup) gtk_object_destroy(GTK_OBJECT(popup));
2697 }
2698 }
2699 /********************************************************************************/
get_one_data_jMRUI(FILE * fd,gint idata,gint numberOfPoints,gdouble * Y)2700 static gboolean get_one_data_jMRUI(FILE*fd, gint idata, gint numberOfPoints, gdouble*Y)
2701 {
2702 gchar t[BSIZE];
2703 gboolean Ok = FALSE;
2704 gint k = 0;
2705 gdouble dum;
2706 while(!feof(fd))
2707 {
2708 if(!fgets(t,BSIZE,fd)) break;
2709 if(strstr(t,"Signal"))
2710 {
2711 k = atoi(strstr(t,"Signal")+1);
2712 if(k==idata)
2713 {
2714 Ok = TRUE;
2715 break;
2716 }
2717 }
2718 }
2719 if(!Ok) return FALSE;
2720 for(k = 0;k<numberOfPoints;k++)
2721 {
2722 if(!fgets(t,BSIZE,fd)) break;
2723 sscanf(t,"%lf %lf %lf",&dum, &dum, &Y[k]);
2724 }
2725 if(k!=numberOfPoints)
2726 return FALSE;
2727 return TRUE;
2728 }
2729 /********************************************************************************/
read_data_jMRUI(GtkFileChooser * filesel,gint response_id)2730 static gboolean read_data_jMRUI(GtkFileChooser *filesel, gint response_id)
2731 {
2732 gchar *fileName;
2733 FILE *fd;
2734 GtkWidget* xyplot = NULL;
2735
2736
2737 gchar t[BSIZE];
2738 gint numberOfPoints = 0;
2739 gdouble* X = NULL;
2740 gdouble* Y = NULL;
2741 gint i;
2742 gdouble dx = -1;
2743 gint nData = 0;
2744 gdouble f = -1;
2745
2746 if(response_id != GTK_RESPONSE_OK) return FALSE;
2747 fileName = gtk_file_chooser_get_filename(filesel);
2748 xyplot = g_object_get_data(G_OBJECT (filesel), "XYPLOT");
2749
2750 fd = fopen(fileName, "rb");
2751 if(!fd) return FALSE;
2752
2753 while(!feof(fd))
2754 {
2755 if(!fgets(t,BSIZE,fd)) break;
2756 if(strstr(t,"PointsInDataset:"))
2757 {
2758 numberOfPoints = atoi(strstr(t,":")+1);
2759 if(dx>0 && nData>0 && f>0) break;
2760 }
2761 if(strstr(t,"SamplingInterval:"))
2762 {
2763 dx = atof(strstr(t,":")+1);
2764 if(numberOfPoints!=0 && nData>0 && f>0) break;
2765 }
2766 if(strstr(t,"DatasetsInFile:"))
2767 {
2768 nData = atoi(strstr(t,":")+1);
2769 if(numberOfPoints!=0 && dx>0 && f>0) break;
2770 }
2771 if(strstr(t,"TransmitterFrequency:"))
2772 {
2773 f = atof(strstr(t,":")+1)/1e6;
2774 if(numberOfPoints!=0 && dx>0 && nData>0) break;
2775 }
2776 }
2777 if(numberOfPoints<1 || nData<1 || dx<=0)
2778 {
2779 GtkWidget* parentWidget = get_parent_window(GTK_WIDGET(xyplot));
2780 GtkWindow* parentWindow = NULL;
2781 if(parentWidget) parentWindow = GTK_WINDOW(parentWidget);
2782 GtkWidget* dialog = gtk_message_dialog_new (GTK_WINDOW(parentWindow),
2783 GTK_DIALOG_DESTROY_WITH_PARENT,
2784 GTK_MESSAGE_ERROR,
2785 GTK_BUTTONS_CLOSE,
2786 _("Error reading file '%s'"),
2787 fileName);
2788 gtk_dialog_run (GTK_DIALOG (dialog));
2789 gtk_widget_destroy (dialog);
2790 }
2791
2792 X = g_realloc(X, numberOfPoints*sizeof(gdouble));
2793 Y = g_realloc(Y, numberOfPoints*sizeof(gdouble));
2794
2795 dx = 1/dx/f/numberOfPoints*1000;
2796
2797 for(i=0;i<numberOfPoints;i++)
2798 X[i] = (dx*i);
2799
2800 for(i=0;i<nData;i++)
2801 {
2802 if(get_one_data_jMRUI(fd,i,numberOfPoints, Y))
2803 add_new_data(xyplot, numberOfPoints, X, Y);
2804 }
2805
2806
2807 if(X) g_free(X);
2808 if(Y) g_free(Y);
2809 return TRUE;
2810
2811 }
2812 /********************************************************************************/
read_data_jMRUI_dlg(GtkWidget * xyplot)2813 static void read_data_jMRUI_dlg(GtkWidget* xyplot)
2814 {
2815 GtkWidget* parentWindow = NULL;
2816 gchar* patternsfiles[] = {"*.txt","*",NULL};
2817 GtkWidget* filesel= NULL;
2818
2819 parentWindow = get_parent_window(GTK_WIDGET(xyplot));
2820 filesel= new_file_chooser_open(parentWindow,
2821 (GCallback *)read_data_jMRUI,
2822 _("Read data from a jMRUI Text file"),
2823 patternsfiles);
2824 gtk_window_set_modal (GTK_WINDOW (filesel), TRUE);
2825 g_object_set_data(G_OBJECT (filesel), "XYPLOT", xyplot);
2826 }
2827 /********************************************************************************/
auto_range_activate(GtkWidget * buttonAutoRange,GtkWidget * xyplot)2828 static void auto_range_activate(GtkWidget* buttonAutoRange, GtkWidget* xyplot)
2829 {
2830 XYPlotData* data = NULL;
2831 data = g_object_get_data(G_OBJECT (buttonAutoRange), "CurentData");
2832 if(xyplot) gabedit_xyplot_set_autorange(GABEDIT_XYPLOT(xyplot), data);
2833 }
2834 /********************************************************************************/
set_max_1_activate(GtkWidget * buttonMax1,GtkWidget * xyplot)2835 static void set_max_1_activate(GtkWidget* buttonMax1, GtkWidget* xyplot)
2836 {
2837 XYPlotData* data = NULL;
2838 gdouble max = 1;
2839 gint i;
2840 if(!buttonMax1) return;
2841 data = g_object_get_data(G_OBJECT (buttonMax1), "CurentData");
2842 if(!data || data->size<1) return;
2843 max = fabs(data->y[0]);
2844 for(i=1;i<data->size;i++) if(max< fabs(data->y[i])) max = fabs(data->y[i]);
2845 for(i=0;i<data->size;i++) data->y[i] /= max;
2846 if(xyplot)
2847 {
2848 gdouble max = (data->y[0]);
2849 gdouble min = (data->y[0]);
2850 for(i=1;i<data->size;i++) if(max< (data->y[i])) max = (data->y[i]);
2851 for(i=1;i<data->size;i++) if(min> (data->y[i])) min = (data->y[i]);
2852
2853 gabedit_xyplot_set_range_ymax (GABEDIT_XYPLOT(xyplot), max);
2854 gabedit_xyplot_set_range_ymin (GABEDIT_XYPLOT(xyplot), min);
2855 }
2856 if(xyplot) gtk_widget_queue_draw(GTK_WIDGET(xyplot));
2857
2858 }
2859 /********************************************************************************/
save_data_2columns_dlg(GtkWidget * buttonSave,GtkWidget * xyplot)2860 static void save_data_2columns_dlg(GtkWidget* buttonSave, GtkWidget* xyplot)
2861 {
2862 GtkWidget* parentWindow = NULL;
2863 gchar* patternsfiles[] = {"*.txt","*",NULL};
2864 GtkWidget* filesel= NULL;
2865 gchar* tmp = NULL;
2866 gpointer* data = NULL;
2867
2868 parentWindow = get_parent_window(GTK_WIDGET(xyplot));
2869 filesel= new_file_chooser_save(parentWindow,
2870 (GCallback *)save_data_2columns,
2871 _("Save data in an ASCII XY file(2 columns)"),
2872 patternsfiles);
2873 gtk_window_set_modal (GTK_WINDOW (filesel), TRUE);
2874 data = g_object_get_data(G_OBJECT (buttonSave), "CurentData");
2875 g_object_set_data(G_OBJECT (filesel), "CurentData", data);
2876 tmp = g_strdup_printf("%s%s%s",g_get_current_dir(),G_DIR_SEPARATOR_S,"xyplotData.txt");
2877 gtk_file_chooser_set_filename ((GtkFileChooser *)filesel, tmp);
2878 if(tmp) g_free(tmp);
2879 gtk_file_chooser_set_current_name ((GtkFileChooser *)filesel, "xyplotData.txt");
2880 }
2881 /********************************************************************************/
save_all_data_2columns_dlg(GtkWidget * xyplot)2882 static void save_all_data_2columns_dlg(GtkWidget* xyplot)
2883 {
2884 GtkWidget* parentWindow = NULL;
2885 gchar* patternsfiles[] = {"*.txt","*",NULL};
2886 GtkWidget* filesel= NULL;
2887 gchar* tmp = NULL;
2888
2889 parentWindow = get_parent_window(GTK_WIDGET(xyplot));
2890 filesel= new_file_chooser_save(parentWindow,
2891 (GCallback *)save_all_data_2columns,
2892 _("Save all data in an ASCII XY file(2 columns)"),
2893 patternsfiles);
2894 gtk_window_set_modal (GTK_WINDOW (filesel), TRUE);
2895 g_object_set_data(G_OBJECT (filesel), "DataList", GABEDIT_XYPLOT(xyplot)->data_list);
2896 tmp = g_strdup_printf("%s%s%s",g_get_current_dir(),G_DIR_SEPARATOR_S,"xyplotData.txt");
2897 gtk_file_chooser_set_filename ((GtkFileChooser *)filesel, tmp);
2898 if(tmp) g_free(tmp);
2899 gtk_file_chooser_set_current_name ((GtkFileChooser *)filesel, "xyplotData.txt");
2900 }
2901 /********************************************************************************/
remove_data(GtkWidget * buttonRemove,gint response_id)2902 static gboolean remove_data(GtkWidget* buttonRemove, gint response_id)
2903 {
2904 XYPlotData* data = NULL;
2905 GtkWidget*window = NULL;
2906 GtkWidget*xyplot = NULL;
2907
2908 if(response_id != GTK_RESPONSE_YES) return FALSE;
2909 data = g_object_get_data(G_OBJECT (buttonRemove), "CurentData");
2910 window = g_object_get_data(G_OBJECT (buttonRemove), "Window");
2911 xyplot = g_object_get_data(G_OBJECT (buttonRemove), "XYPLOT");
2912 if(xyplot && data)
2913 {
2914 gabedit_xyplot_remove_data(GABEDIT_XYPLOT(xyplot), data);
2915 gtk_widget_queue_draw(GTK_WIDGET(xyplot));
2916 }
2917 if(window) gtk_widget_destroy(window);
2918 return TRUE;
2919 }
2920 /********************************************************************************/
remove_data_dlg(GtkWidget * buttonRemove,GtkWidget * xyplot)2921 static void remove_data_dlg(GtkWidget* buttonRemove, GtkWidget* xyplot)
2922 {
2923 GtkWidget* parentWindow = get_parent_window(GTK_WIDGET(xyplot));
2924 GtkWidget* dialog = gtk_message_dialog_new (GTK_WINDOW(parentWindow),
2925 GTK_DIALOG_DESTROY_WITH_PARENT,
2926 GTK_MESSAGE_QUESTION,
2927 GTK_BUTTONS_YES_NO,
2928 _("Are you sure to delete this data ?")
2929 );
2930 gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_NO);
2931 g_signal_connect_swapped(dialog, "response", G_CALLBACK (remove_data), buttonRemove);
2932 gtk_dialog_run (GTK_DIALOG (dialog));
2933 gtk_widget_destroy (dialog);
2934 }
2935 /****************************************************************************************/
spin_font_changed_value(GtkSpinButton * spinbutton,gpointer user_data)2936 static void spin_font_changed_value(GtkSpinButton *spinbutton, gpointer user_data)
2937 {
2938 if(user_data && G_IS_OBJECT(user_data))
2939 {
2940 GtkWidget* xyplot = GTK_WIDGET(user_data);
2941 gint fontSize = gtk_spin_button_get_value(spinbutton);
2942 gchar tmp[100];
2943 sprintf(tmp,"sans %d",fontSize);
2944 gabedit_xyplot_set_font (GABEDIT_XYPLOT(xyplot), tmp);
2945 reset_object_text_pango(GABEDIT_XYPLOT(xyplot));
2946 }
2947 }
2948 /****************************************************************************************/
add_font_size_frame(GtkWidget * hbox,GtkWidget * xyplot)2949 static void add_font_size_frame(GtkWidget* hbox, GtkWidget* xyplot)
2950 {
2951 GtkWidget* frame = NULL;
2952 GtkWidget* hbox_frame = NULL;
2953 GtkWidget* spin_font_size = NULL;
2954
2955 frame=gtk_frame_new(_("Font size"));
2956 gtk_box_pack_start(GTK_BOX(hbox), frame, FALSE, FALSE, 2);
2957 gtk_widget_show(frame);
2958
2959 hbox_frame=gtk_hbox_new(FALSE, 0);
2960 gtk_container_add(GTK_CONTAINER(frame), hbox_frame);
2961 gtk_widget_show(hbox_frame);
2962
2963 hbox=gtk_hbox_new(FALSE, 0);
2964 gtk_container_add(GTK_CONTAINER(hbox_frame), hbox);
2965 gtk_widget_show(hbox);
2966
2967 spin_font_size=gtk_spin_button_new_with_range(8, 30, 1);
2968 gtk_box_pack_start(GTK_BOX(hbox), spin_font_size, TRUE, FALSE, 2);
2969 gtk_widget_show(spin_font_size);
2970
2971 gtk_spin_button_set_value(GTK_SPIN_BUTTON(spin_font_size), GABEDIT_XYPLOT(xyplot)->font_size);
2972 g_signal_connect(G_OBJECT(spin_font_size), "value-changed", G_CALLBACK(spin_font_changed_value), xyplot);
2973 }
2974 /****************************************************************************************/
set_font_size_dialog(GtkWidget * xyplot)2975 static void set_font_size_dialog(GtkWidget* xyplot)
2976 {
2977 GtkWidget* window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2978 GtkWidget* hbox = NULL;
2979 GtkWidget* parentWindow = NULL;
2980
2981 gtk_window_set_title (GTK_WINDOW (window), _("Set font size"));
2982 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
2983 gtk_window_set_modal (GTK_WINDOW (window), TRUE);
2984
2985 g_signal_connect(G_OBJECT(window), "delete_event", G_CALLBACK(gtk_widget_destroy), (gpointer)xyplot);
2986
2987 hbox=gtk_hbox_new(FALSE, 0);
2988 gtk_container_add(GTK_CONTAINER(window), hbox);
2989 gtk_widget_show(hbox);
2990
2991 add_font_size_frame(hbox, xyplot);
2992
2993
2994 parentWindow = get_parent_window(GTK_WIDGET(xyplot));
2995 if(parentWindow)
2996 {
2997 gtk_window_set_transient_for(GTK_WINDOW(window),GTK_WINDOW(parentWindow));
2998 }
2999 gtk_widget_show(window);
3000 }
3001 /****************************************************************************************/
spin_x_digits_changed_value(GtkSpinButton * spinbutton,gpointer user_data)3002 static void spin_x_digits_changed_value(GtkSpinButton *spinbutton, gpointer user_data)
3003 {
3004 if(user_data && G_IS_OBJECT(user_data))
3005 {
3006 GtkWidget* xyplot = GTK_WIDGET(user_data);
3007 gabedit_xyplot_set_x_legends_digits(GABEDIT_XYPLOT(xyplot), gtk_spin_button_get_value(spinbutton));
3008 }
3009 }
3010 /****************************************************************************************/
spin_y_digits_changed_value(GtkSpinButton * spinbutton,gpointer user_data)3011 static void spin_y_digits_changed_value(GtkSpinButton *spinbutton, gpointer user_data)
3012 {
3013 if(user_data && G_IS_OBJECT(user_data))
3014 {
3015 GtkWidget* xyplot = GTK_WIDGET(user_data);
3016 gabedit_xyplot_set_y_legends_digits(GABEDIT_XYPLOT(xyplot), gtk_spin_button_get_value(spinbutton));
3017 }
3018 }
3019 /****************************************************************************************/
add_digits_frame(GtkWidget * hbox,GtkWidget * xyplot)3020 static void add_digits_frame(GtkWidget* hbox, GtkWidget* xyplot)
3021 {
3022 GtkWidget* frame = NULL;
3023 GtkWidget* hbox_frame = NULL;
3024 GtkWidget* label = NULL;
3025 GtkWidget* x_spin_digits = NULL;
3026 GtkWidget* y_spin_digits = NULL;
3027
3028 frame=gtk_frame_new(_("Digits"));
3029 gtk_box_pack_start(GTK_BOX(hbox), frame, FALSE, FALSE, 2);
3030 gtk_widget_show(frame);
3031
3032 hbox_frame=gtk_hbox_new(FALSE, 0);
3033 gtk_container_add(GTK_CONTAINER(frame), hbox_frame);
3034 gtk_widget_show(hbox_frame);
3035
3036 hbox=gtk_hbox_new(FALSE, 0);
3037 gtk_container_add(GTK_CONTAINER(hbox_frame), hbox);
3038 gtk_widget_show(hbox);
3039
3040 label=gtk_label_new(_(" X "));
3041 gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, FALSE, 2);
3042 gtk_widget_show(label);
3043
3044 x_spin_digits=gtk_spin_button_new_with_range(0, 30, 1);
3045 gtk_box_pack_start(GTK_BOX(hbox), x_spin_digits, TRUE, FALSE, 2);
3046 gtk_widget_show(x_spin_digits);
3047
3048 label=gtk_label_new(_(" Y "));
3049 gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, FALSE, 2);
3050 gtk_widget_show(label);
3051
3052 y_spin_digits=gtk_spin_button_new_with_range(0, 30, 1);
3053 gtk_box_pack_start(GTK_BOX(hbox), y_spin_digits, TRUE, FALSE, 2);
3054 gtk_widget_show(y_spin_digits);
3055
3056
3057 gtk_spin_button_set_value(GTK_SPIN_BUTTON(x_spin_digits), GABEDIT_XYPLOT(xyplot)->x_legends_digits);
3058 gtk_spin_button_set_value(GTK_SPIN_BUTTON(y_spin_digits), GABEDIT_XYPLOT(xyplot)->y_legends_digits);
3059
3060 g_signal_connect(G_OBJECT(x_spin_digits), "value-changed", G_CALLBACK(spin_x_digits_changed_value), xyplot);
3061 g_signal_connect(G_OBJECT(y_spin_digits), "value-changed", G_CALLBACK(spin_y_digits_changed_value), xyplot);
3062 }
3063 /****************************************************************************************/
set_digits_dialog(GtkWidget * xyplot)3064 static void set_digits_dialog(GtkWidget* xyplot)
3065 {
3066 GtkWidget* window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3067 GtkWidget* hbox = NULL;
3068 GtkWidget* parentWindow = NULL;
3069
3070 gtk_window_set_title (GTK_WINDOW (window), _("Set digits"));
3071 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
3072 gtk_window_set_modal (GTK_WINDOW (window), TRUE);
3073
3074 g_signal_connect(G_OBJECT(window), "delete_event", G_CALLBACK(gtk_widget_destroy), (gpointer)xyplot);
3075
3076 hbox=gtk_hbox_new(FALSE, 0);
3077 gtk_container_add(GTK_CONTAINER(window), hbox);
3078 gtk_widget_show(hbox);
3079 add_digits_frame(hbox, xyplot);
3080
3081
3082 parentWindow = get_parent_window(GTK_WIDGET(xyplot));
3083 if(parentWindow)
3084 {
3085 gtk_window_set_transient_for(GTK_WINDOW(window),GTK_WINDOW(parentWindow));
3086 }
3087 gtk_widget_show(window);
3088 }
3089 /********************************************************************************/
activate_entry_xlabel(GtkWidget * entry,gpointer user_data)3090 static void activate_entry_xlabel(GtkWidget *entry, gpointer user_data)
3091 {
3092 G_CONST_RETURN gchar* t;
3093 GtkWidget* xyplot = NULL;
3094
3095
3096 if(!user_data || !G_IS_OBJECT(user_data)) return;
3097
3098 xyplot = GTK_WIDGET(user_data);
3099 t= gtk_entry_get_text(GTK_ENTRY(entry));
3100 gabedit_xyplot_set_x_label (GABEDIT_XYPLOT(xyplot), t);
3101 }
3102 /********************************************************************************/
activate_entry_ylabel(GtkWidget * entry,gpointer user_data)3103 static void activate_entry_ylabel(GtkWidget *entry, gpointer user_data)
3104 {
3105 G_CONST_RETURN gchar* t;
3106 GtkWidget* xyplot = NULL;
3107
3108
3109 if(!user_data || !G_IS_OBJECT(user_data)) return;
3110
3111 xyplot = GTK_WIDGET(user_data);
3112 t= gtk_entry_get_text(GTK_ENTRY(entry));
3113 gabedit_xyplot_set_y_label (GABEDIT_XYPLOT(xyplot), t);
3114 }
3115 /****************************************************************************************/
add_labels_frame(GtkWidget * hbox,GtkWidget * xyplot)3116 static void add_labels_frame(GtkWidget* hbox, GtkWidget* xyplot)
3117 {
3118 GtkWidget* frame = NULL;
3119 GtkWidget* hbox_frame = NULL;
3120 GtkWidget* label = NULL;
3121 GtkWidget* entry_x_label = NULL;
3122 GtkWidget* entry_y_label = NULL;
3123
3124 frame=gtk_frame_new(_("Labels"));
3125 gtk_box_pack_start(GTK_BOX(hbox), frame, FALSE, FALSE, 2);
3126 gtk_widget_show(frame);
3127
3128 hbox_frame=gtk_hbox_new(FALSE, 0);
3129 gtk_container_add(GTK_CONTAINER(frame), hbox_frame);
3130 gtk_widget_show(hbox_frame);
3131
3132 label=gtk_label_new(_("X : "));
3133 gtk_box_pack_start(GTK_BOX(hbox_frame), label, FALSE, FALSE, 2);
3134 gtk_widget_show(label);
3135
3136 entry_x_label = gtk_entry_new();
3137 gtk_widget_set_size_request(entry_x_label,100,-1);
3138 if(GABEDIT_XYPLOT(xyplot)->h_label_str)
3139 gtk_entry_set_text(GTK_ENTRY(entry_x_label),GABEDIT_XYPLOT(xyplot)->h_label_str);
3140 else
3141 gtk_entry_set_text(GTK_ENTRY(entry_x_label),"");
3142 gtk_box_pack_start(GTK_BOX(hbox_frame), entry_x_label, FALSE, FALSE, 2);
3143 gtk_widget_show(entry_x_label);
3144
3145 label=gtk_label_new(_("Y : "));
3146 gtk_box_pack_start(GTK_BOX(hbox_frame), label, FALSE, FALSE, 2);
3147 gtk_widget_show(label);
3148
3149 entry_y_label = gtk_entry_new();
3150 gtk_widget_set_size_request(entry_y_label,100,-1);
3151 if(GABEDIT_XYPLOT(xyplot)->v_label_str)
3152 gtk_entry_set_text(GTK_ENTRY(entry_y_label),GABEDIT_XYPLOT(xyplot)->v_label_str);
3153 else
3154 gtk_entry_set_text(GTK_ENTRY(entry_y_label),"");
3155 gtk_box_pack_start(GTK_BOX(hbox_frame), entry_y_label, FALSE, FALSE, 2);
3156 gtk_widget_show(entry_y_label);
3157
3158 g_signal_connect (G_OBJECT (entry_x_label), "activate", (GCallback)activate_entry_xlabel, xyplot);
3159 g_signal_connect (G_OBJECT (entry_y_label), "activate", (GCallback)activate_entry_ylabel, xyplot);
3160 }
3161 /****************************************************************************************/
set_labels_dialog(GtkWidget * xyplot)3162 static void set_labels_dialog(GtkWidget* xyplot)
3163 {
3164 GtkWidget* window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3165 GtkWidget* parentWindow = NULL;
3166 GtkWidget* hbox = NULL;
3167
3168 gtk_window_set_title (GTK_WINDOW (window), _("Set labels"));
3169 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
3170 gtk_window_set_modal (GTK_WINDOW (window), TRUE);
3171
3172 g_signal_connect(G_OBJECT(window), "delete_event", G_CALLBACK(gtk_widget_destroy), (gpointer)xyplot);
3173
3174 hbox=gtk_hbox_new(FALSE, 0);
3175 gtk_container_add(GTK_CONTAINER(window), hbox);
3176 gtk_widget_show(hbox);
3177
3178 add_labels_frame(hbox, xyplot);
3179
3180
3181 parentWindow = get_parent_window(GTK_WIDGET(xyplot));
3182 if(parentWindow)
3183 {
3184 gtk_window_set_transient_for(GTK_WINDOW(window),GTK_WINDOW(parentWindow));
3185 }
3186 gtk_widget_show(window);
3187 }
3188 /********************************************************************************/
activate_entry_xmin(GtkWidget * entry,gpointer user_data)3189 static void activate_entry_xmin(GtkWidget *entry, gpointer user_data)
3190 {
3191 G_CONST_RETURN gchar* t;
3192 gdouble a;
3193 GtkWidget* xyplot = NULL;
3194 gdouble xmin;
3195 gdouble ymin;
3196 gdouble xmax;
3197 gdouble ymax;
3198
3199
3200 if(!user_data || !G_IS_OBJECT(user_data)) return;
3201
3202 xyplot = GTK_WIDGET(user_data);
3203 t= gtk_entry_get_text(GTK_ENTRY(entry));
3204 a = atof(t);
3205 gabedit_xyplot_get_range (GABEDIT_XYPLOT(xyplot), &xmin, &xmax, &ymin, &ymax);
3206
3207 if(a>= xmax)
3208 {
3209 gchar* tmp = g_strdup_printf("%0.3f",xmin);
3210 gtk_entry_set_text(GTK_ENTRY(entry),tmp);
3211 g_free(tmp);
3212 return;
3213 }
3214 gabedit_xyplot_set_range_xmin (GABEDIT_XYPLOT(xyplot), a);
3215 }
3216 /********************************************************************************/
activate_entry_xmax(GtkWidget * entry,gpointer user_data)3217 static void activate_entry_xmax(GtkWidget *entry, gpointer user_data)
3218 {
3219 G_CONST_RETURN gchar* t;
3220 gdouble a;
3221 GtkWidget* xyplot = NULL;
3222 gdouble xmin;
3223 gdouble ymin;
3224 gdouble xmax;
3225 gdouble ymax;
3226
3227
3228 if(!user_data || !G_IS_OBJECT(user_data)) return;
3229
3230 xyplot = GTK_WIDGET(user_data);
3231 t= gtk_entry_get_text(GTK_ENTRY(entry));
3232 a = atof(t);
3233 gabedit_xyplot_get_range (GABEDIT_XYPLOT(xyplot), &xmin, &xmax, &ymin, &ymax);
3234
3235 if(a<=xmin)
3236 {
3237 gchar* tmp = g_strdup_printf("%0.3f",xmax);
3238 gtk_entry_set_text(GTK_ENTRY(entry),tmp);
3239 g_free(tmp);
3240 return;
3241 }
3242 gabedit_xyplot_set_range_xmax (GABEDIT_XYPLOT(xyplot), a);
3243 }
3244 /********************************************************************************/
activate_entry_ymin(GtkWidget * entry,gpointer user_data)3245 static void activate_entry_ymin(GtkWidget *entry, gpointer user_data)
3246 {
3247 G_CONST_RETURN gchar* t;
3248 gdouble a;
3249 GtkWidget* xyplot = NULL;
3250 gdouble xmin;
3251 gdouble ymin;
3252 gdouble xmax;
3253 gdouble ymax;
3254
3255
3256 if(!user_data || !G_IS_OBJECT(user_data)) return;
3257
3258 xyplot = GTK_WIDGET(user_data);
3259 t= gtk_entry_get_text(GTK_ENTRY(entry));
3260 a = atof(t);
3261 gabedit_xyplot_get_range (GABEDIT_XYPLOT(xyplot), &xmin, &xmax, &ymin, &ymax);
3262
3263 if(a>= ymax)
3264 {
3265 gchar* tmp = g_strdup_printf("%0.3f",ymin);
3266 gtk_entry_set_text(GTK_ENTRY(entry),tmp);
3267 g_free(tmp);
3268 return;
3269 }
3270 gabedit_xyplot_set_range_ymin (GABEDIT_XYPLOT(xyplot), a);
3271 }
3272 /********************************************************************************/
activate_entry_ymax(GtkWidget * entry,gpointer user_data)3273 static void activate_entry_ymax(GtkWidget *entry, gpointer user_data)
3274 {
3275 G_CONST_RETURN gchar* t;
3276 gdouble a;
3277 GtkWidget* xyplot = NULL;
3278 gdouble xmin;
3279 gdouble ymin;
3280 gdouble xmax;
3281 gdouble ymax;
3282
3283
3284 if(!user_data || !G_IS_OBJECT(user_data)) return;
3285
3286 xyplot = GTK_WIDGET(user_data);
3287 t= gtk_entry_get_text(GTK_ENTRY(entry));
3288 a = atof(t);
3289 gabedit_xyplot_get_range (GABEDIT_XYPLOT(xyplot), &xmin, &xmax, &ymin, &ymax);
3290
3291 if(a<= ymin)
3292 {
3293 gchar* tmp = g_strdup_printf("%0.3f",ymax);
3294 gtk_entry_set_text(GTK_ENTRY(entry),tmp);
3295 g_free(tmp);
3296 return;
3297 }
3298 gabedit_xyplot_set_range_ymax (GABEDIT_XYPLOT(xyplot), a);
3299 }
3300 /****************************************************************************************/
add_ranges_frame(GtkWidget * hbox,GtkWidget * xyplot)3301 static void add_ranges_frame(GtkWidget* hbox, GtkWidget* xyplot)
3302 {
3303 GtkWidget* frame = NULL;
3304 GtkWidget* hbox_frame = NULL;
3305 GtkWidget* label = NULL;
3306 GtkWidget* entry_x_min = NULL;
3307 GtkWidget* entry_x_max = NULL;
3308 GtkWidget* entry_y_min = NULL;
3309 GtkWidget* entry_y_max = NULL;
3310 gchar tmp[100];
3311
3312 frame=gtk_frame_new(_("Ranges"));
3313 gtk_box_pack_start(GTK_BOX(hbox), frame, FALSE, FALSE, 2);
3314 gtk_widget_show(frame);
3315
3316 hbox_frame=gtk_hbox_new(FALSE, 0);
3317 gtk_container_add(GTK_CONTAINER(frame), hbox_frame);
3318 gtk_widget_show(hbox_frame);
3319
3320 label=gtk_label_new(_("X Min: "));
3321 gtk_box_pack_start(GTK_BOX(hbox_frame), label, FALSE, FALSE, 2);
3322 gtk_widget_show(label);
3323
3324 entry_x_min = gtk_entry_new();
3325 gtk_widget_set_size_request(entry_x_min,50,-1);
3326 sprintf(tmp,"%0.3f",GABEDIT_XYPLOT(xyplot)->xmin);
3327 gtk_entry_set_text(GTK_ENTRY(entry_x_min),tmp);
3328 gtk_box_pack_start(GTK_BOX(hbox_frame), entry_x_min, TRUE, FALSE, 2);
3329 gtk_widget_show(entry_x_min);
3330
3331 label=gtk_label_new(_("X Max: "));
3332 gtk_box_pack_start(GTK_BOX(hbox_frame), label, FALSE, FALSE, 2);
3333 gtk_widget_show(label);
3334
3335 entry_x_max = gtk_entry_new();
3336 gtk_widget_set_size_request(entry_x_max,50,-1);
3337 sprintf(tmp,"%0.3f",GABEDIT_XYPLOT(xyplot)->xmax);
3338 gtk_entry_set_text(GTK_ENTRY(entry_x_max),tmp);
3339 gtk_box_pack_start(GTK_BOX(hbox_frame), entry_x_max, TRUE, FALSE, 2);
3340 gtk_widget_show(entry_x_max);
3341
3342 label=gtk_label_new(_("Y Min: "));
3343 gtk_box_pack_start(GTK_BOX(hbox_frame), label, FALSE, FALSE, 2);
3344 gtk_widget_show(label);
3345
3346 entry_y_min = gtk_entry_new();
3347 gtk_widget_set_size_request(entry_y_min,50,-1);
3348 sprintf(tmp,"%0.3f",GABEDIT_XYPLOT(xyplot)->ymin);
3349 gtk_entry_set_text(GTK_ENTRY(entry_y_min),tmp);
3350 gtk_box_pack_start(GTK_BOX(hbox_frame), entry_y_min, TRUE, FALSE, 2);
3351 gtk_widget_show(entry_y_min);
3352
3353 label=gtk_label_new(_("Y Max: "));
3354 gtk_box_pack_start(GTK_BOX(hbox_frame), label, FALSE, FALSE, 2);
3355 gtk_widget_show(label);
3356
3357 entry_y_max = gtk_entry_new();
3358 gtk_widget_set_size_request(entry_y_max,50,-1);
3359 sprintf(tmp,"%0.3f",GABEDIT_XYPLOT(xyplot)->ymax);
3360 gtk_entry_set_text(GTK_ENTRY(entry_y_max),tmp);
3361 gtk_box_pack_start(GTK_BOX(hbox_frame), entry_y_max, TRUE, FALSE, 2);
3362 gtk_widget_show(entry_y_max);
3363
3364 g_signal_connect (G_OBJECT (entry_x_min), "activate", (GCallback)activate_entry_xmin, xyplot);
3365 g_signal_connect (G_OBJECT (entry_x_max), "activate", (GCallback)activate_entry_xmax, xyplot);
3366 g_signal_connect (G_OBJECT (entry_y_min), "activate", (GCallback)activate_entry_ymin, xyplot);
3367 g_signal_connect (G_OBJECT (entry_y_max), "activate", (GCallback)activate_entry_ymax, xyplot);
3368 }
3369 /****************************************************************************************/
set_ranges_dialog(GtkWidget * xyplot)3370 static void set_ranges_dialog(GtkWidget* xyplot)
3371 {
3372 GtkWidget* window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3373 GtkWidget* parentWindow = NULL;
3374 GtkWidget* hbox = NULL;
3375
3376 gtk_window_set_title (GTK_WINDOW (window), _("Set ranges"));
3377 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
3378 gtk_window_set_modal (GTK_WINDOW (window), TRUE);
3379
3380 g_signal_connect(G_OBJECT(window), "delete_event", G_CALLBACK(gtk_widget_destroy), (gpointer)xyplot);
3381
3382 hbox=gtk_hbox_new(FALSE, 0);
3383 gtk_container_add(GTK_CONTAINER(window), hbox);
3384 gtk_widget_show(hbox);
3385
3386 add_ranges_frame(hbox, xyplot);
3387
3388
3389 parentWindow = get_parent_window(GTK_WIDGET(xyplot));
3390 if(parentWindow)
3391 {
3392 gtk_window_set_transient_for(GTK_WINDOW(window),GTK_WINDOW(parentWindow));
3393 }
3394 gtk_widget_show(window);
3395 }
3396 /****************************************************************************************/
spin_hminor_changed_value(GtkSpinButton * spinbutton,gpointer user_data)3397 static void spin_hminor_changed_value(GtkSpinButton *spinbutton, gpointer user_data)
3398 {
3399 if(user_data && G_IS_OBJECT(user_data))
3400 {
3401 GtkWidget* xyplot = GTK_WIDGET(user_data);
3402 gabedit_xyplot_set_ticks_hminor(GABEDIT_XYPLOT(xyplot), gtk_spin_button_get_value(spinbutton));
3403 }
3404 }
3405 /****************************************************************************************/
spin_hmajor_changed_value(GtkSpinButton * spinbutton,gpointer user_data)3406 static void spin_hmajor_changed_value(GtkSpinButton *spinbutton, gpointer user_data)
3407 {
3408 if(user_data && G_IS_OBJECT(user_data))
3409 {
3410 GtkWidget* xyplot = GTK_WIDGET(user_data);
3411 gabedit_xyplot_set_ticks_hmajor(GABEDIT_XYPLOT(xyplot), gtk_spin_button_get_value(spinbutton));
3412 }
3413 }
3414 /****************************************************************************************/
spin_vminor_changed_value(GtkSpinButton * spinbutton,gpointer user_data)3415 static void spin_vminor_changed_value(GtkSpinButton *spinbutton, gpointer user_data)
3416 {
3417 if(user_data && G_IS_OBJECT(user_data))
3418 {
3419 GtkWidget* xyplot = GTK_WIDGET(user_data);
3420 gabedit_xyplot_set_ticks_vminor(GABEDIT_XYPLOT(xyplot), gtk_spin_button_get_value(spinbutton));
3421 }
3422 }
3423 /****************************************************************************************/
spin_vmajor_changed_value(GtkSpinButton * spinbutton,gpointer user_data)3424 static void spin_vmajor_changed_value(GtkSpinButton *spinbutton, gpointer user_data)
3425 {
3426 if(user_data && G_IS_OBJECT(user_data))
3427 {
3428 GtkWidget* xyplot = GTK_WIDGET(user_data);
3429 gabedit_xyplot_set_ticks_vmajor(GABEDIT_XYPLOT(xyplot), gtk_spin_button_get_value(spinbutton));
3430 }
3431 }
3432 /****************************************************************************************/
spin_length_ticks_changed_value(GtkSpinButton * spinbutton,gpointer user_data)3433 static void spin_length_ticks_changed_value(GtkSpinButton *spinbutton, gpointer user_data)
3434 {
3435 if(user_data && G_IS_OBJECT(user_data))
3436 {
3437 GtkWidget* xyplot = GTK_WIDGET(user_data);
3438 gabedit_xyplot_set_ticks_length(GABEDIT_XYPLOT(xyplot), gtk_spin_button_get_value(spinbutton));
3439 }
3440 }
3441 /****************************************************************************************/
add_ticks_frame(GtkWidget * hbox,GtkWidget * xyplot)3442 static void add_ticks_frame(GtkWidget* hbox, GtkWidget* xyplot)
3443 {
3444 GtkWidget* frame = NULL;
3445 GtkWidget* hbox_frame = NULL;
3446 GtkWidget* label = NULL;
3447 GtkWidget* spin_hmajor = NULL;
3448 GtkWidget* spin_hminor = NULL;
3449 GtkWidget* spin_vmajor = NULL;
3450 GtkWidget* spin_vminor = NULL;
3451 GtkWidget* spin_length = NULL;
3452
3453 frame=gtk_frame_new(_("Ticks"));
3454 gtk_box_pack_start(GTK_BOX(hbox), frame, FALSE, FALSE, 2);
3455 gtk_widget_show(frame);
3456
3457 hbox_frame=gtk_hbox_new(FALSE, 0);
3458 gtk_container_add(GTK_CONTAINER(frame), hbox_frame);
3459 gtk_widget_show(hbox_frame);
3460
3461 hbox=gtk_hbox_new(FALSE, 0);
3462 gtk_container_add(GTK_CONTAINER(hbox_frame), hbox);
3463 gtk_widget_show(hbox);
3464
3465 label=gtk_label_new(_("X Major: "));
3466 gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, FALSE, 2);
3467 gtk_widget_show(label);
3468
3469 spin_hmajor=gtk_spin_button_new_with_range(0, 30, 1);
3470 gtk_box_pack_start(GTK_BOX(hbox), spin_hmajor, TRUE, FALSE, 2);
3471 gtk_widget_show(spin_hmajor);
3472
3473 hbox=gtk_hbox_new(FALSE, 0);
3474 gtk_container_add(GTK_CONTAINER(hbox_frame), hbox);
3475 gtk_widget_show(hbox);
3476
3477 label=gtk_label_new(_("Y Major: "));
3478 gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, FALSE, 2);
3479 gtk_widget_show(label);
3480
3481 spin_vmajor=gtk_spin_button_new_with_range(0, 30, 1);
3482 gtk_box_pack_start(GTK_BOX(hbox), spin_vmajor, TRUE, FALSE, 2);
3483 gtk_widget_show(spin_vmajor);
3484
3485 hbox=gtk_hbox_new(FALSE, 0);
3486 gtk_container_add(GTK_CONTAINER(hbox_frame), hbox);
3487 gtk_widget_show(hbox);
3488
3489 label=gtk_label_new(_("X Minor: "));
3490 gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, FALSE, 2);
3491 gtk_widget_show(label);
3492
3493 spin_hminor=gtk_spin_button_new_with_range(0, 30, 1);
3494 gtk_box_pack_start(GTK_BOX(hbox), spin_hminor, TRUE, FALSE, 2);
3495 gtk_widget_show(spin_hminor);
3496
3497 hbox=gtk_hbox_new(FALSE, 0);
3498 gtk_container_add(GTK_CONTAINER(hbox_frame), hbox);
3499 gtk_widget_show(hbox);
3500
3501 label=gtk_label_new(_("Y Minor: "));
3502 gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, FALSE, 2);
3503 gtk_widget_show(label);
3504
3505 spin_vminor=gtk_spin_button_new_with_range(0, 30, 1);
3506 gtk_box_pack_start(GTK_BOX(hbox), spin_vminor, TRUE, FALSE, 2);
3507 gtk_widget_show(spin_vminor);
3508
3509 hbox=gtk_hbox_new(FALSE, 0);
3510 gtk_container_add(GTK_CONTAINER(hbox_frame), hbox);
3511 gtk_widget_show(hbox);
3512
3513 label=gtk_label_new(_("Length: "));
3514 gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, FALSE, 2);
3515 gtk_widget_show(label);
3516
3517 spin_length=gtk_spin_button_new_with_range(3, 30, 1);
3518 gtk_box_pack_start(GTK_BOX(hbox), spin_length, TRUE, FALSE, 2);
3519 gtk_widget_show(spin_length);
3520
3521 gtk_spin_button_set_value(GTK_SPIN_BUTTON(spin_hmajor), GABEDIT_XYPLOT(xyplot)->hmajor_ticks);
3522 gtk_spin_button_set_value(GTK_SPIN_BUTTON(spin_hminor), GABEDIT_XYPLOT(xyplot)->hminor_ticks);
3523 gtk_spin_button_set_value(GTK_SPIN_BUTTON(spin_vmajor), GABEDIT_XYPLOT(xyplot)->vmajor_ticks);
3524 gtk_spin_button_set_value(GTK_SPIN_BUTTON(spin_vminor), GABEDIT_XYPLOT(xyplot)->vminor_ticks);
3525 gtk_spin_button_set_value(GTK_SPIN_BUTTON(spin_length), GABEDIT_XYPLOT(xyplot)->length_ticks);
3526
3527 g_signal_connect(G_OBJECT(spin_hmajor), "value-changed", G_CALLBACK(spin_hmajor_changed_value), xyplot);
3528 g_signal_connect(G_OBJECT(spin_hminor), "value-changed", G_CALLBACK(spin_hminor_changed_value), xyplot);
3529 g_signal_connect(G_OBJECT(spin_vmajor), "value-changed", G_CALLBACK(spin_vmajor_changed_value), xyplot);
3530 g_signal_connect(G_OBJECT(spin_vminor), "value-changed", G_CALLBACK(spin_vminor_changed_value), xyplot);
3531 g_signal_connect(G_OBJECT(spin_length), "value-changed", G_CALLBACK(spin_length_ticks_changed_value), xyplot);
3532 }
3533 /****************************************************************************************/
set_ticks_dialog(GtkWidget * xyplot)3534 static void set_ticks_dialog(GtkWidget* xyplot)
3535 {
3536 GtkWidget* window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3537 GtkWidget* hbox = NULL;
3538 GtkWidget* parentWindow = NULL;
3539
3540 gtk_window_set_title (GTK_WINDOW (window), _("Set ticks"));
3541 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
3542 gtk_window_set_modal (GTK_WINDOW (window), TRUE);
3543
3544 g_signal_connect(G_OBJECT(window), "delete_event", G_CALLBACK(gtk_widget_destroy), (gpointer)xyplot);
3545
3546 hbox=gtk_hbox_new(FALSE, 0);
3547 gtk_container_add(GTK_CONTAINER(window), hbox);
3548 gtk_widget_show(hbox);
3549
3550 add_ticks_frame(hbox, xyplot);
3551
3552
3553 parentWindow = get_parent_window(GTK_WIDGET(xyplot));
3554 if(parentWindow)
3555 {
3556 gtk_window_set_transient_for(GTK_WINDOW(window),GTK_WINDOW(parentWindow));
3557 }
3558 gtk_widget_show(window);
3559 }
3560 /****************************************************************************************/
spin_right_margins_changed_value(GtkSpinButton * spinbutton,gpointer user_data)3561 static void spin_right_margins_changed_value(GtkSpinButton *spinbutton, gpointer user_data)
3562 {
3563 if(user_data && G_IS_OBJECT(user_data))
3564 {
3565 GtkWidget* xyplot = GTK_WIDGET(user_data);
3566 gabedit_xyplot_set_margins_right(GABEDIT_XYPLOT(xyplot), gtk_spin_button_get_value(spinbutton));
3567 }
3568 }
3569 /****************************************************************************************/
spin_left_margins_changed_value(GtkSpinButton * spinbutton,gpointer user_data)3570 static void spin_left_margins_changed_value(GtkSpinButton *spinbutton, gpointer user_data)
3571 {
3572 if(user_data && G_IS_OBJECT(user_data))
3573 {
3574 GtkWidget* xyplot = GTK_WIDGET(user_data);
3575 gabedit_xyplot_set_margins_left(GABEDIT_XYPLOT(xyplot), gtk_spin_button_get_value(spinbutton));
3576 }
3577 }
3578 /****************************************************************************************/
spin_bottom_margins_changed_value(GtkSpinButton * spinbutton,gpointer user_data)3579 static void spin_bottom_margins_changed_value(GtkSpinButton *spinbutton, gpointer user_data)
3580 {
3581 if(user_data && G_IS_OBJECT(user_data))
3582 {
3583 GtkWidget* xyplot = GTK_WIDGET(user_data);
3584 gabedit_xyplot_set_margins_bottom(GABEDIT_XYPLOT(xyplot), gtk_spin_button_get_value(spinbutton));
3585 }
3586 }
3587 /****************************************************************************************/
spin_top_margins_changed_value(GtkSpinButton * spinbutton,gpointer user_data)3588 static void spin_top_margins_changed_value(GtkSpinButton *spinbutton, gpointer user_data)
3589 {
3590 if(user_data && G_IS_OBJECT(user_data))
3591 {
3592 GtkWidget* xyplot = GTK_WIDGET(user_data);
3593 gabedit_xyplot_set_margins_top(GABEDIT_XYPLOT(xyplot), gtk_spin_button_get_value(spinbutton));
3594 }
3595 }
3596 /****************************************************************************************/
add_margins_frame(GtkWidget * hbox,GtkWidget * xyplot)3597 static void add_margins_frame(GtkWidget* hbox, GtkWidget* xyplot)
3598 {
3599 GtkWidget* frame = NULL;
3600 GtkWidget* hbox_frame = NULL;
3601 GtkWidget* label = NULL;
3602 GtkWidget* spin_left_margins = NULL;
3603 GtkWidget* spin_right_margins = NULL;
3604 GtkWidget* spin_top_margins = NULL;
3605 GtkWidget* spin_bottom_margins = NULL;
3606
3607 frame=gtk_frame_new(_("Margins"));
3608 gtk_box_pack_start(GTK_BOX(hbox), frame, FALSE, FALSE, 2);
3609 gtk_widget_show(frame);
3610
3611 hbox_frame=gtk_hbox_new(FALSE, 0);
3612 gtk_container_add(GTK_CONTAINER(frame), hbox_frame);
3613 gtk_widget_show(hbox_frame);
3614
3615 hbox=gtk_hbox_new(FALSE, 0);
3616 gtk_container_add(GTK_CONTAINER(hbox_frame), hbox);
3617 gtk_widget_show(hbox);
3618
3619 label=gtk_label_new(_("Left: "));
3620 gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, FALSE, 2);
3621 gtk_widget_show(label);
3622
3623 spin_left_margins=gtk_spin_button_new_with_range(0, 30, 1);
3624 gtk_box_pack_start(GTK_BOX(hbox), spin_left_margins, TRUE, FALSE, 2);
3625 gtk_widget_show(spin_left_margins);
3626
3627 hbox=gtk_hbox_new(FALSE, 0);
3628 gtk_container_add(GTK_CONTAINER(hbox_frame), hbox);
3629 gtk_widget_show(hbox);
3630
3631 label=gtk_label_new(_("Top: "));
3632 gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, FALSE, 2);
3633 gtk_widget_show(label);
3634
3635 spin_top_margins=gtk_spin_button_new_with_range(0, 30, 1);
3636 gtk_box_pack_start(GTK_BOX(hbox), spin_top_margins, TRUE, FALSE, 2);
3637 gtk_widget_show(spin_top_margins);
3638
3639 hbox=gtk_hbox_new(FALSE, 0);
3640 gtk_container_add(GTK_CONTAINER(hbox_frame), hbox);
3641 gtk_widget_show(hbox);
3642
3643 label=gtk_label_new(_("Right: "));
3644 gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, FALSE, 2);
3645 gtk_widget_show(label);
3646
3647 spin_right_margins=gtk_spin_button_new_with_range(0, 30, 1);
3648 gtk_box_pack_start(GTK_BOX(hbox), spin_right_margins, TRUE, FALSE, 2);
3649 gtk_widget_show(spin_right_margins);
3650
3651 hbox=gtk_hbox_new(FALSE, 0);
3652 gtk_container_add(GTK_CONTAINER(hbox_frame), hbox);
3653 gtk_widget_show(hbox);
3654
3655 label=gtk_label_new(_("Bottom: "));
3656 gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, FALSE, 2);
3657 gtk_widget_show(label);
3658
3659 spin_bottom_margins=gtk_spin_button_new_with_range(0, 30, 1);
3660 gtk_box_pack_start(GTK_BOX(hbox), spin_bottom_margins, TRUE, FALSE, 2);
3661 gtk_widget_show(spin_bottom_margins);
3662
3663 gtk_spin_button_set_value(GTK_SPIN_BUTTON(spin_left_margins), GABEDIT_XYPLOT(xyplot)->left_margins);
3664 gtk_spin_button_set_value(GTK_SPIN_BUTTON(spin_right_margins), GABEDIT_XYPLOT(xyplot)->right_margins);
3665 gtk_spin_button_set_value(GTK_SPIN_BUTTON(spin_top_margins), GABEDIT_XYPLOT(xyplot)->top_margins);
3666 gtk_spin_button_set_value(GTK_SPIN_BUTTON(spin_bottom_margins), GABEDIT_XYPLOT(xyplot)->bottom_margins);
3667
3668 g_signal_connect(G_OBJECT(spin_left_margins), "value-changed", G_CALLBACK(spin_left_margins_changed_value), xyplot);
3669 g_signal_connect(G_OBJECT(spin_right_margins), "value-changed", G_CALLBACK(spin_right_margins_changed_value), xyplot);
3670 g_signal_connect(G_OBJECT(spin_top_margins), "value-changed", G_CALLBACK(spin_top_margins_changed_value), xyplot);
3671 g_signal_connect(G_OBJECT(spin_bottom_margins), "value-changed", G_CALLBACK(spin_bottom_margins_changed_value), xyplot);
3672 }
3673 /****************************************************************************************/
set_margins_dialog(GtkWidget * xyplot)3674 static void set_margins_dialog(GtkWidget* xyplot)
3675 {
3676 GtkWidget* window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3677 GtkWidget* hbox = NULL;
3678 GtkWidget* parentWindow = NULL;
3679
3680 gtk_window_set_title (GTK_WINDOW (window), _("Set margins"));
3681 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
3682 gtk_window_set_modal (GTK_WINDOW (window), TRUE);
3683
3684 g_signal_connect(G_OBJECT(window), "delete_event", G_CALLBACK(gtk_widget_destroy), (gpointer)xyplot);
3685
3686 hbox=gtk_hbox_new(FALSE, 0);
3687 gtk_container_add(GTK_CONTAINER(window), hbox);
3688 gtk_widget_show(hbox);
3689
3690 add_margins_frame(hbox, xyplot);
3691
3692
3693 parentWindow = get_parent_window(GTK_WIDGET(xyplot));
3694 if(parentWindow)
3695 {
3696 gtk_window_set_transient_for(GTK_WINDOW(window),GTK_WINDOW(parentWindow));
3697 }
3698 gtk_widget_show(window);
3699 }
3700 /****************************************************************************************/
reflect_x_toggled(GtkToggleButton * togglebutton,gpointer user_data)3701 static void reflect_x_toggled(GtkToggleButton *togglebutton, gpointer user_data)
3702 {
3703 if(user_data && G_IS_OBJECT(user_data))
3704 {
3705 GtkWidget* xyplot = GTK_WIDGET(user_data);
3706 gabedit_xyplot_reflect_x (GABEDIT_XYPLOT(xyplot), gtk_toggle_button_get_active(togglebutton));
3707 }
3708 }
3709 /****************************************************************************************/
reflect_y_toggled(GtkToggleButton * togglebutton,gpointer user_data)3710 static void reflect_y_toggled(GtkToggleButton *togglebutton, gpointer user_data)
3711 {
3712 if(user_data && G_IS_OBJECT(user_data))
3713 {
3714 GtkWidget* xyplot = GTK_WIDGET(user_data);
3715 gabedit_xyplot_reflect_y (GABEDIT_XYPLOT(xyplot), gtk_toggle_button_get_active(togglebutton));
3716 }
3717 }
3718 /****************************************************************************************/
add_reflexion_frame(GtkWidget * hbox,GtkWidget * xyplot)3719 static void add_reflexion_frame(GtkWidget* hbox, GtkWidget* xyplot)
3720 {
3721 GtkWidget* frame = NULL;
3722 GtkWidget* hbox_frame = NULL;
3723 GtkWidget* reflect_x_button;
3724 GtkWidget* reflect_y_button;
3725
3726 frame=gtk_frame_new(_("Axes"));
3727 gtk_box_pack_start(GTK_BOX(hbox), frame, FALSE, FALSE, 2);
3728 gtk_widget_show(frame);
3729
3730 hbox_frame=gtk_hbox_new(FALSE, 0);
3731 gtk_container_add(GTK_CONTAINER(frame), hbox_frame);
3732 gtk_widget_show(hbox_frame);
3733
3734 reflect_x_button = gtk_check_button_new_with_label (_("Reflect X"));
3735 gtk_box_pack_start(GTK_BOX(hbox_frame), reflect_x_button, FALSE, FALSE, 2);
3736 gtk_widget_show(reflect_x_button);
3737
3738 reflect_y_button = gtk_check_button_new_with_label (_("Reflect Y"));
3739 gtk_box_pack_start(GTK_BOX(hbox_frame), reflect_y_button, FALSE, FALSE, 2);
3740 gtk_widget_show(reflect_y_button);
3741
3742 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(reflect_x_button), GABEDIT_XYPLOT(xyplot)->reflect_x);
3743 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(reflect_y_button), GABEDIT_XYPLOT(xyplot)->reflect_y);
3744
3745 g_signal_connect (G_OBJECT (reflect_x_button), "toggled", (GCallback)reflect_x_toggled, xyplot);
3746 g_signal_connect (G_OBJECT (reflect_y_button), "toggled", (GCallback)reflect_y_toggled, xyplot);
3747 }
3748 /****************************************************************************************/
show_left_toggled(GtkToggleButton * togglebutton,gpointer user_data)3749 static void show_left_toggled(GtkToggleButton *togglebutton, gpointer user_data)
3750 {
3751 if(user_data && G_IS_OBJECT(user_data))
3752 {
3753 GtkWidget* xyplot = GTK_WIDGET(user_data);
3754 gabedit_xyplot_show_left_legends (GABEDIT_XYPLOT(xyplot), gtk_toggle_button_get_active(togglebutton));
3755 }
3756 }
3757 /****************************************************************************************/
show_right_toggled(GtkToggleButton * togglebutton,gpointer user_data)3758 static void show_right_toggled(GtkToggleButton *togglebutton, gpointer user_data)
3759 {
3760 if(user_data && G_IS_OBJECT(user_data))
3761 {
3762 GtkWidget* xyplot = GTK_WIDGET(user_data);
3763 gabedit_xyplot_show_right_legends (GABEDIT_XYPLOT(xyplot), gtk_toggle_button_get_active(togglebutton));
3764 }
3765 }
3766 /****************************************************************************************/
show_top_toggled(GtkToggleButton * togglebutton,gpointer user_data)3767 static void show_top_toggled(GtkToggleButton *togglebutton, gpointer user_data)
3768 {
3769 if(user_data && G_IS_OBJECT(user_data))
3770 {
3771 GtkWidget* xyplot = GTK_WIDGET(user_data);
3772 gabedit_xyplot_show_top_legends (GABEDIT_XYPLOT(xyplot), gtk_toggle_button_get_active(togglebutton));
3773 }
3774 }
3775 /****************************************************************************************/
show_bottom_toggled(GtkToggleButton * togglebutton,gpointer user_data)3776 static void show_bottom_toggled(GtkToggleButton *togglebutton, gpointer user_data)
3777 {
3778 if(user_data && G_IS_OBJECT(user_data))
3779 {
3780 GtkWidget* xyplot = GTK_WIDGET(user_data);
3781 gabedit_xyplot_show_bottom_legends (GABEDIT_XYPLOT(xyplot), gtk_toggle_button_get_active(togglebutton));
3782 }
3783 }
3784 /****************************************************************************************/
show_rectangle_toggled(GtkToggleButton * togglebutton,gpointer user_data)3785 static void show_rectangle_toggled(GtkToggleButton *togglebutton, gpointer user_data)
3786 {
3787 if(user_data && G_IS_OBJECT(user_data))
3788 {
3789 GtkWidget* xyplot = GTK_WIDGET(user_data);
3790 gabedit_xyplot_show_rectangle_legends (GABEDIT_XYPLOT(xyplot), gtk_toggle_button_get_active(togglebutton));
3791 }
3792 }
3793 /****************************************************************************************/
add_legends_frame(GtkWidget * hbox,GtkWidget * xyplot)3794 static void add_legends_frame(GtkWidget* hbox, GtkWidget* xyplot)
3795 {
3796 GtkWidget* frame = NULL;
3797 GtkWidget* hbox_frame = NULL;
3798 GtkWidget* show_left;
3799 GtkWidget* show_right;
3800 GtkWidget* show_top;
3801 GtkWidget* show_bottom;
3802 GtkWidget* show_rectangle;
3803
3804 frame=gtk_frame_new(_("Legends"));
3805 gtk_box_pack_start(GTK_BOX(hbox), frame, FALSE, FALSE, 2);
3806 gtk_widget_show(frame);
3807
3808 hbox_frame=gtk_hbox_new(FALSE, 0);
3809 gtk_container_add(GTK_CONTAINER(frame), hbox_frame);
3810 gtk_widget_show(hbox_frame);
3811
3812 show_left = gtk_check_button_new_with_label (_("Left"));
3813 gtk_box_pack_start(GTK_BOX(hbox_frame), show_left, FALSE, FALSE, 2);
3814 gtk_widget_show(show_left);
3815
3816 show_right = gtk_check_button_new_with_label (_("Right"));
3817 gtk_box_pack_start(GTK_BOX(hbox_frame), show_right, FALSE, FALSE, 2);
3818 gtk_widget_show(show_right);
3819
3820 show_top = gtk_check_button_new_with_label (_("Top"));
3821 gtk_box_pack_start(GTK_BOX(hbox_frame), show_top, FALSE, FALSE, 2);
3822 gtk_widget_show(show_top);
3823
3824 show_bottom = gtk_check_button_new_with_label (_("Bottom"));
3825 gtk_box_pack_start(GTK_BOX(hbox_frame), show_bottom, FALSE, FALSE, 2);
3826 gtk_widget_show(show_bottom);
3827
3828 show_rectangle = gtk_check_button_new_with_label (_("Rectangle"));
3829 gtk_box_pack_start(GTK_BOX(hbox_frame), show_rectangle, FALSE, FALSE, 2);
3830 gtk_widget_show(show_rectangle);
3831
3832 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(show_left), GABEDIT_XYPLOT(xyplot)->show_left_legends);
3833 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(show_right), GABEDIT_XYPLOT(xyplot)->show_right_legends);
3834 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(show_top), GABEDIT_XYPLOT(xyplot)->show_top_legends);
3835 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(show_bottom), GABEDIT_XYPLOT(xyplot)->show_bottom_legends);
3836 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(show_rectangle), GABEDIT_XYPLOT(xyplot)->show_rectangle_legends);
3837
3838 g_signal_connect (G_OBJECT (show_left), "toggled", (GCallback)show_left_toggled, xyplot);
3839 g_signal_connect (G_OBJECT (show_right), "toggled", (GCallback)show_right_toggled, xyplot);
3840 g_signal_connect (G_OBJECT (show_top), "toggled", (GCallback)show_top_toggled, xyplot);
3841 g_signal_connect (G_OBJECT (show_bottom), "toggled", (GCallback)show_bottom_toggled, xyplot);
3842 g_signal_connect (G_OBJECT (show_rectangle), "toggled", (GCallback)show_rectangle_toggled, xyplot);
3843 }
3844 /****************************************************************************************/
h_major_grids_toggled(GtkToggleButton * togglebutton,gpointer user_data)3845 static void h_major_grids_toggled(GtkToggleButton *togglebutton, gpointer user_data)
3846 {
3847 if(user_data && G_IS_OBJECT(user_data))
3848 {
3849 GtkWidget* xyplot = GTK_WIDGET(user_data);
3850 gabedit_xyplot_enable_grids (GABEDIT_XYPLOT(xyplot), GABEDIT_XYPLOT_HMAJOR_GRID, gtk_toggle_button_get_active(togglebutton));
3851 }
3852 }
3853 /****************************************************************************************/
h_minor_grids_toggled(GtkToggleButton * togglebutton,gpointer user_data)3854 static void h_minor_grids_toggled(GtkToggleButton *togglebutton, gpointer user_data)
3855 {
3856 if(user_data && G_IS_OBJECT(user_data))
3857 {
3858 GtkWidget* xyplot = GTK_WIDGET(user_data);
3859 gabedit_xyplot_enable_grids (GABEDIT_XYPLOT(xyplot), GABEDIT_XYPLOT_HMINOR_GRID, gtk_toggle_button_get_active(togglebutton));
3860 }
3861 }
3862 /****************************************************************************************/
v_major_grids_toggled(GtkToggleButton * togglebutton,gpointer user_data)3863 static void v_major_grids_toggled(GtkToggleButton *togglebutton, gpointer user_data)
3864 {
3865 if(user_data && G_IS_OBJECT(user_data))
3866 {
3867 GtkWidget* xyplot = GTK_WIDGET(user_data);
3868 gabedit_xyplot_enable_grids (GABEDIT_XYPLOT(xyplot), GABEDIT_XYPLOT_VMAJOR_GRID, gtk_toggle_button_get_active(togglebutton));
3869 }
3870 }
3871 /****************************************************************************************/
v_minor_grids_toggled(GtkToggleButton * togglebutton,gpointer user_data)3872 static void v_minor_grids_toggled(GtkToggleButton *togglebutton, gpointer user_data)
3873 {
3874 if(user_data && G_IS_OBJECT(user_data))
3875 {
3876 GtkWidget* xyplot = GTK_WIDGET(user_data);
3877 gabedit_xyplot_enable_grids (GABEDIT_XYPLOT(xyplot), GABEDIT_XYPLOT_VMINOR_GRID, gtk_toggle_button_get_active(togglebutton));
3878 }
3879 }
3880 /****************************************************************************************/
add_grid_frame(GtkWidget * hbox,GtkWidget * xyplot)3881 static void add_grid_frame(GtkWidget* hbox, GtkWidget* xyplot)
3882 {
3883 GtkWidget* frame = NULL;
3884 GtkWidget* hbox_frame = NULL;
3885 GtkWidget* h_major;
3886 GtkWidget* h_minor;
3887 GtkWidget* v_major;
3888 GtkWidget* v_minor;
3889
3890 frame=gtk_frame_new(_("Grid"));
3891 gtk_box_pack_start(GTK_BOX(hbox), frame, FALSE, FALSE, 2);
3892 gtk_widget_show(frame);
3893
3894 hbox_frame=gtk_hbox_new(FALSE, 0);
3895 gtk_container_add(GTK_CONTAINER(frame), hbox_frame);
3896 gtk_widget_show(hbox_frame);
3897
3898 h_major = gtk_check_button_new_with_label (_("H major"));
3899 gtk_box_pack_start(GTK_BOX(hbox_frame), h_major, FALSE, FALSE, 2);
3900 gtk_widget_show(h_major);
3901
3902 v_major = gtk_check_button_new_with_label (_("V major"));
3903 gtk_box_pack_start(GTK_BOX(hbox_frame), v_major, FALSE, FALSE, 2);
3904 gtk_widget_show(v_major);
3905
3906 h_minor = gtk_check_button_new_with_label (_("H minor"));
3907 gtk_box_pack_start(GTK_BOX(hbox_frame), h_minor, FALSE, FALSE, 2);
3908 gtk_widget_show(h_minor);
3909
3910 v_minor = gtk_check_button_new_with_label (_("V minor"));
3911 gtk_box_pack_start(GTK_BOX(hbox_frame), v_minor, FALSE, FALSE, 2);
3912 gtk_widget_show(v_minor);
3913
3914 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(h_major), GABEDIT_XYPLOT(xyplot)->hmajor_grid);
3915 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(h_minor), GABEDIT_XYPLOT(xyplot)->hminor_grid);
3916 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(v_major), GABEDIT_XYPLOT(xyplot)->vmajor_grid);
3917 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(v_minor), GABEDIT_XYPLOT(xyplot)->vminor_grid);
3918
3919 g_signal_connect (G_OBJECT (h_major), "toggled", (GCallback)h_major_grids_toggled, xyplot);
3920 g_signal_connect (G_OBJECT (h_minor), "toggled", (GCallback)h_minor_grids_toggled, xyplot);
3921 g_signal_connect (G_OBJECT (v_major), "toggled", (GCallback)v_major_grids_toggled, xyplot);
3922 g_signal_connect (G_OBJECT (v_minor), "toggled", (GCallback)v_minor_grids_toggled, xyplot);
3923 }
3924 /********************************************************************************/
activate_entry_xmincut(GtkWidget * entry,gpointer user_data)3925 static void activate_entry_xmincut(GtkWidget *entry, gpointer user_data)
3926 {
3927 if(user_data && G_IS_OBJECT(user_data))
3928 {
3929 GtkWidget* xyplot = GTK_WIDGET(user_data);
3930 XYPlotData* data = g_object_get_data(G_OBJECT (entry), "CurentData");
3931 gint loop;
3932 gdouble a;
3933 G_CONST_RETURN gchar* t;
3934 g_return_if_fail (GABEDIT_IS_XYPLOT (xyplot));
3935 t= gtk_entry_get_text(GTK_ENTRY(entry));
3936 if(!t) return;
3937 a = atof(t);
3938 if(data)
3939 {
3940 int n = 0;
3941 for(loop=0;loop<data->size; loop++) if(data->x[loop]>=a) n++;
3942 if(n!=data->size && n>0)
3943 {
3944 gdouble* X = g_malloc(n*sizeof(gdouble));
3945 gdouble* Y = g_malloc(n*sizeof(gdouble));
3946 n= 0;
3947 for(loop=0;loop<data->size; loop++)
3948 if(data->x[loop]>=a)
3949 {
3950 X[n] = data->x[loop];
3951 Y[n] = data->y[loop];
3952 n++;
3953 }
3954 if(data->x) g_free(data->x);
3955 if(data->y) g_free(data->y);
3956 data->x = X;
3957 data->y = Y;
3958 data->size = n;
3959 }
3960 }
3961 gtk_widget_queue_draw(GTK_WIDGET(xyplot));
3962 }
3963 }
3964 /********************************************************************************/
activate_entry_xmaxcut(GtkWidget * entry,gpointer user_data)3965 static void activate_entry_xmaxcut(GtkWidget *entry, gpointer user_data)
3966 {
3967 if(user_data && G_IS_OBJECT(user_data))
3968 {
3969 GtkWidget* xyplot = GTK_WIDGET(user_data);
3970 XYPlotData* data = g_object_get_data(G_OBJECT (entry), "CurentData");
3971 gint loop;
3972 gdouble a;
3973 G_CONST_RETURN gchar* t;
3974 g_return_if_fail (GABEDIT_IS_XYPLOT (xyplot));
3975 t= gtk_entry_get_text(GTK_ENTRY(entry));
3976 if(!t) return;
3977 a = atof(t);
3978 if(data)
3979 {
3980 int n = 0;
3981 for(loop=0;loop<data->size; loop++) if(data->x[loop]<=a) n++;
3982 if(n!=data->size && n>0)
3983 {
3984 gdouble* X = g_malloc(n*sizeof(gdouble));
3985 gdouble* Y = g_malloc(n*sizeof(gdouble));
3986 n= 0;
3987 for(loop=0;loop<data->size; loop++)
3988 if(data->x[loop]<=a)
3989 {
3990 X[n] = data->x[loop];
3991 Y[n] = data->y[loop];
3992 n++;
3993 }
3994 if(data->x) g_free(data->x);
3995 if(data->y) g_free(data->y);
3996 data->x = X;
3997 data->y = Y;
3998 data->size = n;
3999 }
4000 }
4001 gtk_widget_queue_draw(GTK_WIDGET(xyplot));
4002 }
4003 }
4004 /********************************************************************************/
add_cut_data_frame(GtkWidget * hbox,GtkWidget * xyplot,XYPlotData * data)4005 static void add_cut_data_frame(GtkWidget* hbox, GtkWidget* xyplot, XYPlotData *data)
4006 {
4007 GtkWidget* frame = NULL;
4008 GtkWidget* hbox_frame = NULL;
4009 GtkWidget* label = NULL;
4010 GtkWidget* entry_x_min = NULL;
4011 GtkWidget* entry_x_max = NULL;
4012 gchar tmp[100];
4013
4014 frame=gtk_frame_new(_("Cut data"));
4015 gtk_box_pack_start(GTK_BOX(hbox), frame, FALSE, FALSE, 2);
4016 gtk_widget_show(frame);
4017
4018 hbox_frame=gtk_hbox_new(FALSE, 0);
4019 gtk_container_add(GTK_CONTAINER(frame), hbox_frame);
4020 gtk_widget_show(hbox_frame);
4021
4022 label=gtk_label_new(_("X Min: "));
4023 gtk_box_pack_start(GTK_BOX(hbox_frame), label, FALSE, FALSE, 2);
4024 gtk_widget_show(label);
4025
4026 entry_x_min = gtk_entry_new();
4027 gtk_widget_set_size_request(entry_x_min,80,-1);
4028 sprintf(tmp,"%0.3f",GABEDIT_XYPLOT(xyplot)->xmin);
4029 gtk_entry_set_text(GTK_ENTRY(entry_x_min),tmp);
4030 gtk_box_pack_start(GTK_BOX(hbox_frame), entry_x_min, TRUE, FALSE, 2);
4031 gtk_widget_show(entry_x_min);
4032
4033 label=gtk_label_new(_(" X Max: "));
4034 gtk_box_pack_start(GTK_BOX(hbox_frame), label, FALSE, FALSE, 2);
4035 gtk_widget_show(label);
4036
4037 entry_x_max = gtk_entry_new();
4038 gtk_widget_set_size_request(entry_x_max,80,-1);
4039 sprintf(tmp,"%0.3f",GABEDIT_XYPLOT(xyplot)->xmax);
4040 gtk_entry_set_text(GTK_ENTRY(entry_x_max),tmp);
4041 gtk_box_pack_start(GTK_BOX(hbox_frame), entry_x_max, TRUE, FALSE, 2);
4042 gtk_widget_show(entry_x_max);
4043
4044 g_object_set_data(G_OBJECT (entry_x_min), "CurentData", data);
4045 g_object_set_data(G_OBJECT (entry_x_max), "CurentData", data);
4046 g_signal_connect (G_OBJECT (entry_x_min), "activate", (GCallback)activate_entry_xmincut, xyplot);
4047 g_signal_connect (G_OBJECT (entry_x_max), "activate", (GCallback)activate_entry_xmaxcut, xyplot);
4048 }
4049 /********************************************************************************/
activate_entry_x_linear(GtkWidget * entry,gpointer user_data)4050 static void activate_entry_x_linear(GtkWidget *entry, gpointer user_data)
4051 {
4052 if(user_data && G_IS_OBJECT(user_data))
4053 {
4054 GtkWidget* xyplot = GTK_WIDGET(user_data);
4055 XYPlotData* data = g_object_get_data(G_OBJECT (entry), "CurentData");
4056 gint N;
4057 G_CONST_RETURN gchar* t;
4058 g_return_if_fail (GABEDIT_IS_XYPLOT (xyplot));
4059 t= gtk_entry_get_text(GTK_ENTRY(entry));
4060 if(!t) return;
4061 N = atoi(t);
4062 if(data && N>1)
4063 {
4064 gdouble* x = NULL;
4065 gdouble* y = NULL;
4066 build_linear_x(data->x, data->y, data->size, &x, &y, N);
4067 g_free(data->x);
4068 g_free(data->y);
4069 data->x = x;
4070 data->y = y;
4071 data->size = N;
4072 }
4073 gtk_widget_queue_draw(GTK_WIDGET(xyplot));
4074 }
4075 }
4076 /********************************************************************************/
add_x_linear_data_frame(GtkWidget * hbox,GtkWidget * xyplot,XYPlotData * data)4077 static void add_x_linear_data_frame(GtkWidget* hbox, GtkWidget* xyplot, XYPlotData *data)
4078 {
4079 GtkWidget* frame = NULL;
4080 GtkWidget* hbox_frame = NULL;
4081 GtkWidget* label = NULL;
4082 GtkWidget* entry_x_linear = NULL;
4083 gchar tmp[100];
4084
4085 frame=gtk_frame_new(_("X Linearization"));
4086 gtk_box_pack_start(GTK_BOX(hbox), frame, FALSE, FALSE, 2);
4087 gtk_widget_show(frame);
4088
4089 hbox_frame=gtk_hbox_new(FALSE, 0);
4090 gtk_container_add(GTK_CONTAINER(frame), hbox_frame);
4091 gtk_widget_show(hbox_frame);
4092
4093 label=gtk_label_new(_("N points : "));
4094 gtk_box_pack_start(GTK_BOX(hbox_frame), label, FALSE, FALSE, 2);
4095 gtk_widget_show(label);
4096
4097 entry_x_linear = gtk_entry_new();
4098 gtk_widget_set_size_request(entry_x_linear,80,-1);
4099
4100 if(data) sprintf(tmp,"%d", 2*data->size);
4101 else sprintf(tmp,"%d",100);
4102
4103 gtk_entry_set_text(GTK_ENTRY(entry_x_linear),tmp);
4104 gtk_box_pack_start(GTK_BOX(hbox_frame), entry_x_linear, TRUE, FALSE, 2);
4105 gtk_widget_show(entry_x_linear);
4106
4107 g_object_set_data(G_OBJECT (entry_x_linear), "CurentData", data);
4108 g_signal_connect (G_OBJECT (entry_x_linear), "activate", (GCallback)activate_entry_x_linear, xyplot);
4109 }
4110 /********************************************************************************************************/
add_combo_correction(GtkWidget * hbox)4111 static GtkWidget *add_combo_correction(GtkWidget *hbox)
4112 {
4113 GtkTreeIter iter;
4114 GtkTreeStore *store;
4115 GtkTreeModel *model;
4116 GtkWidget *combobox;
4117 GtkCellRenderer *renderer;
4118
4119 store = gtk_tree_store_new (1,G_TYPE_STRING);
4120
4121 gtk_tree_store_append (store, &iter, NULL);
4122 gtk_tree_store_set (store, &iter, 0, "Fourier : no correction", -1);
4123 gtk_tree_store_append (store, &iter, NULL);
4124 gtk_tree_store_set (store, &iter, 0, "Harmonic (w*beta hbar w)", -1);
4125 gtk_tree_store_append (store, &iter, NULL);
4126 gtk_tree_store_set (store, &iter, 0, "Classic : w ( 1 - exp(-beta hbar w) )", -1);
4127 gtk_tree_store_append (store, &iter, NULL);
4128 gtk_tree_store_set (store, &iter, 0, "Kubo : w tanh(beta hbar w/2) ", -1);
4129 gtk_tree_store_append (store, &iter, NULL);
4130 gtk_tree_store_set (store, &iter, 0, "Schofield : w ( 1 - exp(-beta hbar w) ) exp(beta hbar w/2)", -1);
4131
4132 model = GTK_TREE_MODEL (store);
4133 combobox = gtk_combo_box_new_with_model (model);
4134 g_object_unref (model);
4135 gtk_box_pack_start (GTK_BOX (hbox), combobox, TRUE, TRUE, 1);
4136 renderer = gtk_cell_renderer_text_new ();
4137 gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combobox), renderer, TRUE);
4138 gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (combobox), renderer, "text", 0, NULL);
4139
4140 return combobox;
4141 }
4142 /********************************************************************************/
add_fourier_data_frame(GtkWidget * hbox,GtkWidget * xyplot,XYPlotData * data,GtkWidget * parentWindow)4143 static void add_fourier_data_frame(GtkWidget* hbox, GtkWidget* xyplot, XYPlotData *data, GtkWidget* parentWindow)
4144 {
4145 GtkWidget* frame = NULL;
4146 GtkWidget* vbox_frame = NULL;
4147 GtkWidget* hbox_frame = NULL;
4148 GtkWidget* label = NULL;
4149 GtkWidget* entry_scale = NULL;
4150 GtkWidget* entry_xmax = NULL;
4151 GtkWidget* entry_temperature = NULL;
4152 GtkWidget* buttonDFT = NULL;
4153 GtkWidget* combo = NULL;
4154 GtkWidget* normalize_button = NULL;
4155 gchar tmp[100];
4156
4157 frame=gtk_frame_new(_("Fourier transformation"));
4158 gtk_box_pack_start(GTK_BOX(hbox), frame, FALSE, TRUE, 2);
4159 gtk_widget_show(frame);
4160
4161 vbox_frame=gtk_vbox_new(FALSE, 0);
4162 gtk_container_add(GTK_CONTAINER(frame), vbox_frame);
4163 gtk_widget_show(vbox_frame);
4164
4165 hbox_frame=gtk_hbox_new(FALSE, 0);
4166 gtk_box_pack_start(GTK_BOX(vbox_frame), hbox_frame, FALSE, FALSE, 2);
4167 gtk_widget_show(hbox_frame);
4168
4169 label=gtk_label_new(_("Scale X : "));
4170 gtk_box_pack_start(GTK_BOX(hbox_frame), label, FALSE, FALSE, 2);
4171 gtk_widget_show(label);
4172
4173 entry_scale = gtk_entry_new();
4174 gtk_widget_set_size_request(entry_scale,100,-1);
4175 sprintf(tmp,"%0.3f",33356.40951982);
4176 gtk_entry_set_text(GTK_ENTRY(entry_scale),tmp);
4177 gtk_box_pack_start(GTK_BOX(hbox_frame), entry_scale, FALSE, FALSE, 2);
4178 gtk_widget_show(entry_scale);
4179 g_object_set_data(G_OBJECT ( xyplot), "Entry_scale", entry_scale);
4180
4181 label=gtk_label_new(_("X max : "));
4182 gtk_box_pack_start(GTK_BOX(hbox_frame), label, FALSE, FALSE, 2);
4183 gtk_widget_show(label);
4184
4185 entry_xmax = gtk_entry_new();
4186 gtk_widget_set_size_request(entry_xmax,100,-1);
4187 sprintf(tmp,"%0.3f",6000.0);
4188 gtk_entry_set_text(GTK_ENTRY(entry_xmax),tmp);
4189 gtk_box_pack_start(GTK_BOX(hbox_frame), entry_xmax, FALSE, FALSE, 2);
4190 gtk_widget_show(entry_xmax);
4191 g_object_set_data(G_OBJECT ( xyplot), "Entry_xmax", entry_xmax);
4192
4193
4194 hbox_frame=gtk_hbox_new(FALSE, 0);
4195 gtk_box_pack_start(GTK_BOX(vbox_frame), hbox_frame, FALSE, FALSE, 2);
4196 gtk_widget_show(hbox_frame);
4197
4198 label=gtk_label_new(_("Correction :"));
4199 gtk_box_pack_start(GTK_BOX(hbox_frame), label, TRUE, FALSE, 2);
4200 gtk_widget_show(label);
4201
4202 combo = add_combo_correction(hbox_frame);
4203 gtk_combo_box_set_active (GTK_COMBO_BOX (combo), 0);
4204 gtk_widget_show(combo);
4205 g_object_set_data(G_OBJECT (xyplot), "ComboCorrection", combo);
4206
4207 hbox_frame=gtk_hbox_new(FALSE, 0);
4208 gtk_box_pack_start(GTK_BOX(vbox_frame), hbox_frame, FALSE, FALSE, 2);
4209 gtk_widget_show(hbox_frame);
4210
4211 label=gtk_label_new(_(" Temperature (K) : "));
4212 gtk_box_pack_start(GTK_BOX(hbox_frame), label, FALSE, FALSE, 2);
4213 gtk_widget_show(label);
4214
4215 entry_temperature = gtk_entry_new();
4216 gtk_widget_set_size_request(entry_temperature,100,-1);
4217 sprintf(tmp,"%0.3f",300.0);
4218 gtk_entry_set_text(GTK_ENTRY(entry_temperature),tmp);
4219 gtk_box_pack_start(GTK_BOX(hbox_frame), entry_temperature, FALSE, FALSE, 2);
4220 gtk_widget_show(entry_temperature);
4221 g_object_set_data(G_OBJECT ( xyplot), "Entry_temperature", entry_temperature);
4222
4223 normalize_button = gtk_check_button_new_with_label (_("Normalize"));
4224 gtk_box_pack_start(GTK_BOX(hbox_frame), normalize_button, FALSE, FALSE, 2);
4225 gtk_widget_show(normalize_button);
4226 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(normalize_button), TRUE);
4227 g_object_set_data(G_OBJECT ( xyplot), "NormalizeDFTButton", normalize_button);
4228
4229
4230 hbox_frame=gtk_hbox_new(FALSE, 0);
4231 gtk_box_pack_start(GTK_BOX(vbox_frame), hbox_frame, FALSE, FALSE, 2);
4232 gtk_widget_show(hbox_frame);
4233 buttonDFT = gtk_button_new_with_label (_("DFT"));
4234 gtk_box_pack_start(GTK_BOX(hbox_frame), buttonDFT, TRUE, TRUE, 4);
4235 gtk_widget_show (buttonDFT);
4236
4237 g_object_set_data(G_OBJECT ( xyplot), "CurentData", data);
4238 g_object_set_data(G_OBJECT (buttonDFT), "ParentWindow", parentWindow);
4239
4240 g_signal_connect(G_OBJECT(buttonDFT), "clicked", G_CALLBACK(build_fourier), xyplot);
4241
4242 }
4243 /****************************************************************************************/
set_all_dialog(GtkWidget * xyplot)4244 static void set_all_dialog(GtkWidget* xyplot)
4245 {
4246 GtkWidget* window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4247 GtkWidget* parentWindow = NULL;
4248 GtkWidget* hbox = NULL;
4249 GtkWidget* vbox = NULL;
4250
4251 gtk_window_set_title (GTK_WINDOW (window), _("Set"));
4252 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
4253 gtk_window_set_modal (GTK_WINDOW (window), TRUE);
4254
4255 g_signal_connect(G_OBJECT(window), "delete_event", G_CALLBACK(gtk_widget_destroy), (gpointer)xyplot);
4256
4257 vbox=gtk_vbox_new(FALSE, 0);
4258 gtk_container_add(GTK_CONTAINER(window), vbox);
4259 gtk_widget_show(vbox);
4260
4261 hbox=gtk_hbox_new(FALSE, 0);
4262 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 1);
4263 add_ranges_frame(hbox, xyplot);
4264 gtk_widget_show(hbox);
4265
4266 hbox=gtk_hbox_new(FALSE, 0);
4267 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 1);
4268 add_margins_frame(hbox, xyplot);
4269 gtk_widget_show(hbox);
4270
4271 hbox=gtk_hbox_new(FALSE, 0);
4272 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 1);
4273 add_labels_frame(hbox, xyplot);
4274 add_font_size_frame(hbox, xyplot);
4275 add_digits_frame(hbox, xyplot);
4276 gtk_widget_show(hbox);
4277
4278 hbox=gtk_hbox_new(FALSE, 0);
4279 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 1);
4280 add_ticks_frame(hbox, xyplot);
4281 gtk_widget_show(hbox);
4282
4283
4284 hbox=gtk_hbox_new(FALSE, 0);
4285 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 1);
4286 add_reflexion_frame(hbox, xyplot);
4287 add_legends_frame(hbox, xyplot);
4288 add_grid_frame(hbox, xyplot);
4289 gtk_widget_show(hbox);
4290
4291
4292 parentWindow = get_parent_window(GTK_WIDGET(xyplot));
4293 if(parentWindow)
4294 {
4295 gtk_window_set_transient_for(GTK_WINDOW(window),GTK_WINDOW(parentWindow));
4296 }
4297 gtk_widget_show(window);
4298 }
4299 /****************************************************************************************/
gabedit_xyplot_save_gabedit_lines(GabeditXYPlot * xyplot,FILE * file)4300 static void gabedit_xyplot_save_gabedit_lines(GabeditXYPlot *xyplot, FILE* file)
4301 {
4302 gint i;
4303 fprintf(file,"lines %d\n", xyplot->nObjectsLine);
4304 for(i=0;i<xyplot->nObjectsLine;i++)
4305 {
4306 fprintf(file,"%lf %lf %lf %lf %d %d %lf %lf %lf %d\n",
4307 xyplot->objectsLine[i].x1,
4308 xyplot->objectsLine[i].y1,
4309 xyplot->objectsLine[i].x2,
4310 xyplot->objectsLine[i].y2,
4311 xyplot->objectsLine[i].width,
4312 xyplot->objectsLine[i].arrow_size,
4313 SCALE(xyplot->objectsLine[i].color.red),
4314 SCALE(xyplot->objectsLine[i].color.green),
4315 SCALE(xyplot->objectsLine[i].color.blue),
4316 xyplot->objectsLine[i].style
4317 );
4318 }
4319 }
4320 /****************************************************************************************/
gabedit_xyplot_save_gabedit_texts(GabeditXYPlot * xyplot,FILE * file)4321 static void gabedit_xyplot_save_gabedit_texts(GabeditXYPlot *xyplot, FILE* file)
4322 {
4323 gint i;
4324 fprintf(file,"texts %d\n", xyplot->nObjectsText);
4325 for(i=0;i<xyplot->nObjectsText;i++)
4326 {
4327 fprintf(file,"%lf %lf %lf\n",
4328 xyplot->objectsText[i].x,
4329 xyplot->objectsText[i].y,
4330 xyplot->objectsText[i].angle
4331 );
4332 fprintf(file,"%s\n", xyplot->objectsText[i].str);
4333 }
4334 }
4335 /*************************************************************************************/
get_suffix_name_file(const gchar * allname)4336 static gchar *get_suffix_name_file(const gchar* allname)
4337 {
4338 gchar *filename= g_path_get_basename(allname);
4339 gchar *dirname= g_path_get_dirname(allname);
4340 gchar *temp= g_strdup(filename);
4341 gint len=strlen(filename);
4342 gint i;
4343 gchar* name = NULL;
4344
4345 if(!allname || strlen(allname)<1) return g_strdup("error");
4346 filename= g_path_get_basename(allname);
4347 dirname= g_path_get_dirname(allname);
4348 temp= g_strdup(filename);
4349 len=strlen(filename);
4350
4351 for(i=len;i>0;i--)
4352 if(temp[i]=='.')
4353 {
4354 temp[i] = '\0';
4355 break;
4356 }
4357 name = g_strdup_printf("%s%s%s",dirname,G_DIR_SEPARATOR_S,temp);
4358 if(temp) g_free(temp);
4359 if(dirname) g_free(dirname);
4360 if(filename) g_free(filename);
4361
4362 if(strcmp(name,".")==0) name = g_strdup(g_get_current_dir());
4363
4364 return name;
4365 }
4366 /*************************************************************************************/
get_filename_png(const gchar * allname,gint i)4367 static gchar *get_filename_png(const gchar* allname, gint i)
4368 {
4369 gchar *bas = get_suffix_name_file(allname);
4370 if(bas)
4371 {
4372 gchar* fn = g_strdup_printf("%s_%d.png",bas,i);
4373 g_free(bas);
4374 return fn;
4375 }
4376 return g_strdup_printf("%d.png",i);
4377 }
4378 /****************************************************************************************/
gabedit_xyplot_save_gabedit_images(GabeditXYPlot * xyplot,FILE * file,gchar * fileName)4379 static void gabedit_xyplot_save_gabedit_images(GabeditXYPlot *xyplot, FILE* file, gchar* fileName)
4380 {
4381 gint i;
4382 gchar *fn;
4383 fprintf(file,"images %d\n", xyplot->nObjectsImage);
4384 for(i=0;i<xyplot->nObjectsImage;i++)
4385 {
4386 fprintf(file,"%lf %lf %lf %lf\n",
4387 xyplot->objectsImage[i].x,
4388 xyplot->objectsImage[i].y,
4389 xyplot->objectsImage[i].width,
4390 xyplot->objectsImage[i].height
4391 );
4392 fn = get_filename_png(fileName, i);
4393 fprintf(file,"%s\n", fn);
4394 cairo_surface_write_to_png (xyplot->objectsImage[i].image,fn);
4395 g_free(fn);
4396 }
4397 }
4398 /****************************************************************************************/
gabedit_xyplot_save_gabedit_parameters(GabeditXYPlot * xyplot,FILE * file)4399 static void gabedit_xyplot_save_gabedit_parameters(GabeditXYPlot *xyplot, FILE* file)
4400 {
4401 GdkColor foreColor;
4402 GdkColor backColor;
4403 GdkGCValues gc_values;
4404 GdkColormap *colormap;
4405
4406 colormap = gdk_window_get_colormap(GTK_WIDGET(xyplot)->window);
4407 gdk_gc_get_values(xyplot->back_gc, &gc_values);
4408 gdk_colormap_query_color(colormap, gc_values.foreground.pixel,&backColor);
4409 gdk_gc_get_values(xyplot->fore_gc, &gc_values);
4410 gdk_colormap_query_color(colormap, gc_values.foreground.pixel,&foreColor);
4411
4412 fprintf(file,"theme %d %d %d %d %d %d %d\n", gc_values.line_width,
4413 (gint)foreColor.red, (gint)foreColor.green,(gint)foreColor.blue,
4414 (gint)backColor.red, (gint)backColor.green,(gint)backColor.blue);
4415 fprintf(file,"digits %d %d\n", xyplot->x_legends_digits, xyplot->y_legends_digits);
4416 fprintf(file,"ticks %d %d %d %d %d\n", xyplot->length_ticks, xyplot->hmajor_ticks, xyplot->hminor_ticks, xyplot->vmajor_ticks, xyplot->vminor_ticks);
4417 fprintf(file,"margins %d %d %d %d\n", xyplot->left_margins, xyplot->top_margins, xyplot->right_margins, xyplot->bottom_margins);
4418 fprintf(file,"grid %d %d %d %d\n", xyplot->hmajor_grid, xyplot->hminor_grid, xyplot->vmajor_grid, xyplot->vminor_grid);
4419 fprintf(file,"legends %d %d %d %d %d\n", xyplot->show_left_legends, xyplot->show_right_legends, xyplot->show_top_legends, xyplot->show_bottom_legends,xyplot->show_rectangle_legends);
4420 fprintf(file,"axes %d %d\n", xyplot->reflect_x, xyplot->reflect_y);
4421 fprintf(file,"fonts %d\n", xyplot->font_size);
4422 fprintf(file,"minmax %lf %lf %lf %lf\n", xyplot->xmin, xyplot->xmax, xyplot->ymin, xyplot->ymax);
4423 if(xyplot->h_label_str)
4424 {
4425 fprintf(file,"hlabel 1\n");
4426 fprintf(file,"%s\n", xyplot->h_label_str);
4427 }
4428 else fprintf(file,"hlabel 0\n");
4429 if(xyplot->v_label_str)
4430 {
4431 fprintf(file,"vlabel 1\n");
4432 fprintf(file,"%s\n", xyplot->v_label_str);
4433 }
4434 else fprintf(file,"vlabel 0\n");
4435
4436 }
4437 /****************************************************************************************/
gabedit_xyplot_save_gabedit_data(XYPlotData * data,FILE * file)4438 static void gabedit_xyplot_save_gabedit_data(XYPlotData* data, FILE* file)
4439 {
4440 gint i;
4441 fprintf(file,"dataline %lf %lf %lf %d %d\n",
4442 SCALE(data->line_color.red),
4443 SCALE(data->line_color.green),
4444 SCALE(data->line_color.blue),
4445 data->line_width,
4446 data->line_style);
4447 fprintf(file,"datapoint %lf %lf %lf %d %s\n",
4448 SCALE(data->point_color.red),
4449 SCALE(data->point_color.green),
4450 SCALE(data->point_color.blue),
4451 data->point_size,
4452 data->point_str);
4453 fprintf(file,"size %d\n", data->size);
4454 for(i=0;i<data->size;i++)
4455 fprintf(file,"%lf %lf\n", data->x[i],data->y[i]);
4456 }
4457 /****************************************************************************************/
gabedit_xyplot_save_gabedit_datas(GabeditXYPlot * xyplot,FILE * file)4458 static void gabedit_xyplot_save_gabedit_datas(GabeditXYPlot *xyplot, FILE* file)
4459 {
4460 gint nDatas = 0;
4461 XYPlotData* data;
4462 GList *current_node=g_list_first(GABEDIT_XYPLOT(xyplot)->data_list);
4463 for (; current_node!=NULL; current_node=current_node->next) nDatas++;
4464 fprintf(file,"ndatas %d\n",nDatas);
4465 if(nDatas<1) return;
4466 current_node=g_list_first(GABEDIT_XYPLOT(xyplot)->data_list);
4467 for (; current_node!=NULL; current_node=current_node->next)
4468 {
4469 data=(XYPlotData*)current_node->data;
4470 gabedit_xyplot_save_gabedit_data(data, file);
4471 }
4472 }
4473 /****************************************************************************************/
gabedit_xyplot_save_gabedit(GtkWidget * xyplot,gchar * fileName)4474 static void gabedit_xyplot_save_gabedit(GtkWidget* xyplot, gchar* fileName)
4475 {
4476 FILE* file = fopen(fileName, "w");
4477 if(!file)
4478 {
4479 GtkWidget* dialog = NULL;
4480 gchar* tmp = g_strdup_printf(_("Sorry, I cannot open %s file"),fileName);
4481 dialog = gtk_message_dialog_new_with_markup (NULL,
4482 GTK_DIALOG_DESTROY_WITH_PARENT,
4483 GTK_MESSAGE_INFO, GTK_BUTTONS_OK,
4484 "%s",tmp);
4485 gtk_dialog_run (GTK_DIALOG (dialog));
4486 gtk_widget_destroy (dialog);
4487 g_free(tmp);
4488 return;
4489 }
4490 fprintf(file,"[Gabedit format]\n");
4491 fprintf(file,"[XYPLOT]\n");
4492 gabedit_xyplot_save_gabedit_parameters(GABEDIT_XYPLOT(xyplot), file);
4493 gabedit_xyplot_save_gabedit_texts(GABEDIT_XYPLOT(xyplot), file);
4494 gabedit_xyplot_save_gabedit_lines(GABEDIT_XYPLOT(xyplot), file);
4495 gabedit_xyplot_save_gabedit_images(GABEDIT_XYPLOT(xyplot), file,fileName);
4496 gabedit_xyplot_save_gabedit_datas(GABEDIT_XYPLOT(xyplot), file);
4497 fclose(file);
4498 }
4499 /**************************************************************************/
saveAsGabedit(GtkFileChooser * SelecFile,gint response_id)4500 static void saveAsGabedit(GtkFileChooser *SelecFile, gint response_id)
4501 {
4502 gchar *fileName;
4503 GtkWidget* xyplot = g_object_get_data (G_OBJECT (SelecFile), "XYPLOT");
4504
4505 if(response_id != GTK_RESPONSE_OK) return;
4506 if(!GABEDIT_IS_XYPLOT(xyplot)) return;
4507 fileName = gtk_file_chooser_get_filename(SelecFile);
4508 gabedit_xyplot_save_gabedit(xyplot, fileName);
4509 }
4510 /********************************************************************************/
saveAsGabeditDlg(GtkWidget * xyplot)4511 static void saveAsGabeditDlg(GtkWidget* xyplot)
4512 {
4513 GtkFileFilter *filter;
4514 GtkWidget *dialog;
4515 GtkWidget *parentWindow;
4516
4517 dialog = g_object_new (GTK_TYPE_FILE_CHOOSER_DIALOG, "action", GTK_FILE_CHOOSER_ACTION_SAVE, "file-system-backend", "gtk+", "select-multiple", FALSE, NULL);
4518 gtk_window_set_title (GTK_WINDOW (dialog), _("Save as Gabedit format"));
4519 gtk_dialog_add_buttons (GTK_DIALOG (dialog), GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_SAVE, GTK_RESPONSE_OK, NULL);
4520 filter = gtk_file_filter_new ();
4521
4522 gtk_file_filter_set_name (filter, "*.gab");
4523 gtk_file_filter_add_pattern (filter, "*.gab");
4524 gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), filter);
4525
4526 gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK);
4527 g_signal_connect (dialog, "response", G_CALLBACK (saveAsGabedit),GTK_OBJECT(dialog));
4528 g_signal_connect (dialog, "response", G_CALLBACK (gtk_widget_destroy),GTK_OBJECT(dialog));
4529 gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER (dialog),"xyplot.gab");
4530
4531 g_object_set_data (G_OBJECT (dialog), "XYPLOT",xyplot);
4532 gtk_window_set_modal (GTK_WINDOW (dialog), TRUE);
4533 parentWindow = get_parent_window(GTK_WIDGET(xyplot));
4534 if(parentWindow) gtk_window_set_transient_for(GTK_WINDOW(dialog),GTK_WINDOW(parentWindow));
4535 gtk_widget_show(dialog);
4536 }
4537 /****************************************************************************************/
gabedit_xyplot_read_gabedit_lines(GabeditXYPlot * xyplot,FILE * file)4538 static gboolean gabedit_xyplot_read_gabedit_lines(GabeditXYPlot *xyplot, FILE* file)
4539 {
4540 gint i;
4541 gchar t[BSIZE];
4542 gchar tmp[BSIZE];
4543 gint style;
4544 if(xyplot->objectsLine)
4545 {
4546 g_free(xyplot->objectsLine);
4547 xyplot->objectsLine = NULL;
4548 }
4549 if(!fgets(t,BSIZE,file)) return FALSE;
4550 sscanf(t,"%s %d\n", tmp, &xyplot->nObjectsLine);
4551 if(xyplot->nObjectsLine>0)
4552 xyplot->objectsLine = g_malloc(xyplot->nObjectsLine*sizeof(XYPlotObjectLine));
4553
4554 for(i=0;i<xyplot->nObjectsLine;i++)
4555 {
4556 gdouble r,g,b;
4557 if(!fgets(t,BSIZE,file))
4558 {
4559 xyplot->nObjectsLine= 0;
4560 g_free(xyplot->objectsLine);
4561 xyplot->objectsLine = NULL;
4562 xyplot->nObjectsLine = 0;
4563 return FALSE;
4564 }
4565 sscanf(t,"%lf %lf %lf %lf %d %d %lf %lf %lf %d\n",
4566 &xyplot->objectsLine[i].x1,
4567 &xyplot->objectsLine[i].y1,
4568 &xyplot->objectsLine[i].x2,
4569 &xyplot->objectsLine[i].y2,
4570 &xyplot->objectsLine[i].width,
4571 &xyplot->objectsLine[i].arrow_size,
4572 &r,&g,&b,
4573 &style
4574 );
4575 xyplot->objectsLine[i].style = style;
4576 xyplot->objectsLine[i].color.red=SCALE2(r);
4577 xyplot->objectsLine[i].color.green=SCALE2(g);
4578 xyplot->objectsLine[i].color.blue=SCALE2(b);
4579 }
4580 reset_object_line_pixels(xyplot);
4581 return TRUE;
4582 }
4583 /****************************************************************************************/
gabedit_xyplot_read_gabedit_texts(GabeditXYPlot * xyplot,FILE * file)4584 static gboolean gabedit_xyplot_read_gabedit_texts(GabeditXYPlot *xyplot, FILE* file)
4585 {
4586 gint i;
4587 gchar t[BSIZE];
4588 gchar tmp[BSIZE];
4589 if(xyplot->objectsText)
4590 {
4591 for(i=0;i<xyplot->nObjectsText;i++)
4592 {
4593 if(xyplot->objectsText[i].str) g_free(xyplot->objectsText[i].str);
4594 if(xyplot->objectsText[i].pango) g_object_unref(xyplot->objectsText[i].pango);
4595 }
4596 g_free(xyplot->objectsText);
4597 xyplot->objectsText = NULL;
4598 xyplot->nObjectsText = 0;
4599 }
4600 if(!fgets(t,BSIZE,file)) return FALSE;
4601 sscanf(t,"%s %d\n", tmp, &xyplot->nObjectsText);
4602 if(xyplot->nObjectsText>0)
4603 {
4604 xyplot->objectsText = g_malloc(xyplot->nObjectsText*sizeof(XYPlotObjectText));
4605 for(i=0;i<xyplot->nObjectsText;i++) xyplot->objectsText[i].str = NULL;
4606 }
4607 for(i=0;i<xyplot->nObjectsText;i++)
4608 {
4609 if(!fgets(t,BSIZE,file))
4610 {
4611 for(i=0;i<xyplot->nObjectsText;i++)
4612 if(xyplot->objectsText[i].str) g_free(xyplot->objectsText[i].str);
4613 xyplot->nObjectsText= 0;
4614 g_free(xyplot->objectsText);
4615 xyplot->objectsText = NULL;
4616 return FALSE;
4617 }
4618 sscanf(t,"%lf %lf %lf", &xyplot->objectsText[i].x, &xyplot->objectsText[i].y,&xyplot->objectsText[i].angle);
4619 if(fgets(t,BSIZE,file))
4620 {
4621 gint j;
4622 for(j=0;j<strlen(t);j++) if(t[j]=='\n') t[j] = ' ';
4623 for(j=0;j<strlen(t);j++) if(t[j]=='\r') t[j] = ' ';
4624 xyplot->objectsText[i].str= g_strdup(t);
4625 for(j=strlen(t);j>=0;j--) if(t[j]==' ') t[j] = '\0';
4626 }
4627 else xyplot->objectsText[i].str = g_strdup(" ");
4628 }
4629 for(i=0;i<xyplot->nObjectsText;i++)
4630 {
4631 set_object_text_pango(xyplot, &xyplot->objectsText[i]);
4632 set_object_text_pixels(xyplot, &xyplot->objectsText[i]);
4633 }
4634 return TRUE;
4635 }
4636 /****************************************************************************************/
gabedit_xyplot_read_gabedit_images(GabeditXYPlot * xyplot,FILE * file)4637 static gboolean gabedit_xyplot_read_gabedit_images(GabeditXYPlot *xyplot, FILE* file)
4638 {
4639 gint i;
4640 gchar t[BSIZE];
4641 gchar tmp[BSIZE];
4642 if(xyplot->objectsImage)
4643 {
4644 for(i=0;i<xyplot->nObjectsImage;i++)
4645 {
4646 if(xyplot->objectsImage[i].fileName) g_free(xyplot->objectsImage[i].fileName);
4647 if(xyplot->objectsImage[i].image) cairo_surface_destroy (xyplot->objectsImage[i].image);
4648 }
4649 g_free(xyplot->objectsImage);
4650 xyplot->objectsImage = NULL;
4651 xyplot->nObjectsImage = 0;
4652 }
4653 if(!fgets(t,BSIZE,file)) return FALSE;
4654 sscanf(t,"%s %d\n", tmp, &xyplot->nObjectsImage);
4655 if(xyplot->nObjectsImage>0)
4656 {
4657 xyplot->objectsImage = g_malloc(xyplot->nObjectsImage*sizeof(XYPlotObjectImage));
4658 for(i=0;i<xyplot->nObjectsImage;i++) xyplot->objectsImage[i].fileName = NULL;
4659 for(i=0;i<xyplot->nObjectsImage;i++) xyplot->objectsImage[i].image = NULL;
4660 }
4661 for(i=0;i<xyplot->nObjectsImage;i++)
4662 {
4663 gdouble x,y,w,h;
4664 if(!fgets(t,BSIZE,file))
4665 {
4666 for(i=0;i<xyplot->nObjectsImage;i++)
4667 if(xyplot->objectsImage[i].fileName) g_free(xyplot->objectsImage[i].fileName);
4668 xyplot->nObjectsImage= 0;
4669 g_free(xyplot->objectsImage);
4670 xyplot->objectsImage = NULL;
4671 return FALSE;
4672 }
4673 sscanf(t,"%lf %lf %lf %lf", &x, &y, &w, &h);
4674 xyplot->objectsImage[i].x = x;
4675 xyplot->objectsImage[i].y = y;
4676 xyplot->objectsImage[i].width = w;
4677 xyplot->objectsImage[i].height = h;
4678 if(fgets(t,BSIZE,file))
4679 {
4680 gint j;
4681 gint len;
4682 len = strlen(t);
4683 for(j=0;j<strlen(t);j++)
4684 {
4685 if(t[j]=='\n') t[j] = ' ';
4686 if(t[j]=='\r') t[j] = ' ';
4687 }
4688 len = strlen(t);
4689 for(j=len;j>=0;j--) if(t[j]==' ') t[j] = '\0';
4690 xyplot->objectsImage[i].fileName= g_strdup(t);
4691 }
4692 else xyplot->objectsImage[i].fileName = g_strdup(" ");
4693 }
4694 for(i=0;i<xyplot->nObjectsImage;i++)
4695 {
4696 xyplot->objectsImage[i].image = cairo_image_surface_create_from_png (xyplot->objectsImage[i].fileName);
4697 if(!xyplot->objectsImage[i].image)
4698 {
4699 printf("I cannot read %s png file\n",xyplot->objectsImage[i].fileName);
4700 }
4701 }
4702 reset_object_image_pixels(xyplot);
4703 return TRUE;
4704 }
4705 /****************************************************************************************/
gabedit_xyplot_read_gabedit_parameters(GabeditXYPlot * xyplot,FILE * file)4706 static gboolean gabedit_xyplot_read_gabedit_parameters(GabeditXYPlot *xyplot, FILE* file)
4707 {
4708 gchar tmp[BSIZE];
4709 gchar t[BSIZE];
4710 gint i;
4711 gint r1, g1, b1;
4712 gint r2, g2, b2;
4713 GdkColor foreColor;
4714 GdkColor backColor;
4715 gint line_width;
4716
4717 if(!fgets(t,BSIZE,file)) return FALSE;
4718 sscanf(t,"%s %d %d %d %d %d %d %d", tmp, &line_width, &r1, &g1, &b1, &r2, &g2, &b2);
4719 foreColor.red = (gushort)r1;
4720 foreColor.green = (gushort)g1;
4721 foreColor.blue = (gushort)b1;
4722 backColor.red = (gushort)r2;
4723 backColor.green = (gushort)g2;
4724 backColor.blue = (gushort)b2;
4725
4726 if(!fgets(t,BSIZE,file)) return FALSE;
4727 sscanf(t,"%s %d %d", tmp, &xyplot->x_legends_digits, &xyplot->y_legends_digits);
4728 if(!fgets(t,BSIZE,file)) return FALSE;
4729 sscanf(t,"%s %d %d %d %d %d", tmp, &xyplot->length_ticks, &xyplot->hmajor_ticks, &xyplot->hminor_ticks, &xyplot->vmajor_ticks, &xyplot->vminor_ticks);
4730 if(!fgets(t,BSIZE,file)) return FALSE;
4731 sscanf(t,"%s %d %d %d %d", tmp, &xyplot->left_margins, &xyplot->top_margins, &xyplot->right_margins, &xyplot->bottom_margins);
4732 if(!fgets(t,BSIZE,file)) return FALSE;
4733 sscanf(t,"%s %d %d %d %d", tmp, &xyplot->hmajor_grid, &xyplot->hminor_grid, &xyplot->vmajor_grid, &xyplot->vminor_grid);
4734 gabedit_xyplot_enable_grids (GABEDIT_XYPLOT(xyplot), GABEDIT_XYPLOT_HMAJOR_GRID, xyplot->hmajor_grid);
4735 gabedit_xyplot_enable_grids (GABEDIT_XYPLOT(xyplot), GABEDIT_XYPLOT_HMINOR_GRID, xyplot->hminor_grid);
4736 gabedit_xyplot_enable_grids (GABEDIT_XYPLOT(xyplot), GABEDIT_XYPLOT_VMAJOR_GRID, xyplot->vmajor_grid);
4737 gabedit_xyplot_enable_grids (GABEDIT_XYPLOT(xyplot), GABEDIT_XYPLOT_VMINOR_GRID, xyplot->vminor_grid);
4738 if(!fgets(t,BSIZE,file)) return FALSE;
4739 sscanf(t,"%s %d %d %d %d %d", tmp, &xyplot->show_left_legends, &xyplot->show_right_legends, &xyplot->show_top_legends, &xyplot->show_bottom_legends,&xyplot->show_rectangle_legends);
4740 gabedit_xyplot_show_left_legends (GABEDIT_XYPLOT(xyplot), xyplot->show_left_legends);
4741 gabedit_xyplot_show_right_legends (GABEDIT_XYPLOT(xyplot), xyplot->show_right_legends);
4742 gabedit_xyplot_show_top_legends (GABEDIT_XYPLOT(xyplot), xyplot->show_top_legends);
4743 gabedit_xyplot_show_bottom_legends (GABEDIT_XYPLOT(xyplot), xyplot->show_bottom_legends);
4744 gabedit_xyplot_show_rectangle_legends (GABEDIT_XYPLOT(xyplot), xyplot->show_rectangle_legends);
4745 if(!fgets(t,BSIZE,file)) return FALSE;
4746 sscanf(t,"%s %d %d", tmp, &xyplot->reflect_x, &xyplot->reflect_y);
4747 gabedit_xyplot_reflect_x (GABEDIT_XYPLOT(xyplot), xyplot->reflect_x);
4748 gabedit_xyplot_reflect_y (GABEDIT_XYPLOT(xyplot), xyplot->reflect_y);
4749 if(!fgets(t,BSIZE,file)) return FALSE;
4750 sscanf(t,"%s %d", tmp, &xyplot->font_size);
4751 if(!fgets(t,BSIZE,file)) return FALSE;
4752 sscanf(t,"%s %lf %lf %lf %lf", tmp, &xyplot->xmin, &xyplot->xmax, &xyplot->ymin, &xyplot->ymax);
4753
4754 if(xyplot->h_label_str) g_free(xyplot->h_label_str);
4755 if(xyplot->v_label_str) g_free(xyplot->v_label_str);
4756 xyplot->h_label_str = NULL;
4757 xyplot->v_label_str = NULL;
4758 if(!fgets(t,BSIZE,file)) return FALSE;
4759 sscanf(t,"%s %d",tmp,&i);
4760 if(i!=0)
4761 {
4762 gint j;
4763 if(!fgets(t,BSIZE,file)) return FALSE;
4764 for(j=0;j<strlen(t);j++) if(t[j]=='\n') t[j] = '\0';
4765 for(j=0;j<strlen(t);j++) if(t[j]=='\r') t[j] = '\0';
4766 xyplot->h_label_str = g_strdup(t);
4767 }
4768 if(!fgets(t,BSIZE,file)) return FALSE;
4769 sscanf(t,"%s %d",tmp,&i);
4770 if(i!=0)
4771 {
4772 gint j;
4773 if(!fgets(t,BSIZE,file)) return FALSE;
4774 for(j=0;j<strlen(t);j++) if(t[j]=='\n') t[j] = '\0';
4775 for(j=0;j<strlen(t);j++) if(t[j]=='\r') t[j] = '\0';
4776 xyplot->v_label_str = g_strdup(t);
4777 }
4778 xyplot_build_legends(xyplot);
4779 xyplot_calculate_legends_sizes(xyplot);
4780 xyplot_calculate_sizes(xyplot);
4781 reset_theme(GTK_WIDGET(xyplot), line_width, &foreColor, &backColor);
4782 return TRUE;
4783
4784 }
4785 /****************************************************************************************/
gabedit_xyplot_read_gabedit_data(XYPlotData * data,FILE * file)4786 static gboolean gabedit_xyplot_read_gabedit_data(XYPlotData* data, FILE* file)
4787 {
4788 gint i;
4789 gchar tmp[BSIZE];
4790 gchar t[BSIZE];
4791 gdouble r,g,b;
4792 gint style;
4793 data->size = 0;
4794 data->x = NULL;
4795 data->y = NULL;
4796 if(!fgets(t,BSIZE,file)) return FALSE;
4797 sscanf(t,"%s %lf %lf %lf %d %d",
4798 tmp,
4799 &r,&g,&b,
4800 &data->line_width,
4801 &style);
4802 data->line_style = style;
4803 data->line_color.red = SCALE2(r);
4804 data->line_color.green = SCALE2(g);
4805 data->line_color.blue = SCALE2(b);
4806 if(!fgets(t,BSIZE,file)) return FALSE;
4807 sscanf(t,"%s %lf %lf %lf %d %s",
4808 tmp,
4809 &r,&g,&b,
4810 &data->point_size,
4811 data->point_str);
4812 data->point_color.red = SCALE2(r);
4813 data->point_color.green = SCALE2(g);
4814 data->point_color.blue = SCALE2(b);
4815 if(!fgets(t,BSIZE,file)) return FALSE;
4816 sscanf(t,"%s %d", tmp, &data->size);
4817 if(data->size<1) return TRUE;
4818 data->x = g_malloc(data->size*sizeof(gdouble));
4819 data->y = g_malloc(data->size*sizeof(gdouble));
4820 for(i=0;i<data->size;i++)
4821 {
4822 if(!fgets(t,BSIZE,file))
4823 {
4824 data->size = 0;
4825 if(data->x) g_free(data->x);
4826 if(data->y) g_free(data->y);
4827 data->x = NULL;
4828 data->y = NULL;
4829 return FALSE;
4830 }
4831
4832 sscanf(t,"%lf %lf", &data->x[i],&data->y[i]);
4833 }
4834 return TRUE;
4835 }
4836 /****************************************************************************************/
gabedit_xyplot_read_gabedit_datas(GabeditXYPlot * xyplot,FILE * file)4837 static gboolean gabedit_xyplot_read_gabedit_datas(GabeditXYPlot *xyplot, FILE* file)
4838 {
4839 gint nDatas = 0;
4840 gchar tmp[BSIZE];
4841 gchar t[BSIZE];
4842 gint i;
4843
4844 if(!fgets(t,BSIZE,file)) return FALSE;
4845 sscanf(t,"%s %d",tmp, &nDatas);
4846 if(nDatas<1) return TRUE;
4847 if(GABEDIT_XYPLOT(xyplot)->data_list)
4848 {
4849 g_list_foreach(GABEDIT_XYPLOT(xyplot)->data_list, (GFunc)g_free, NULL);
4850 g_list_free(GABEDIT_XYPLOT(xyplot)->data_list);
4851 GABEDIT_XYPLOT(xyplot)->data_list = NULL;
4852 }
4853 for(i=0;i<nDatas;i++)
4854 {
4855 XYPlotData *data = g_malloc(sizeof(XYPlotData));
4856 if(!gabedit_xyplot_read_gabedit_data(data, file)) return FALSE;
4857 xyplot_build_points_data(GABEDIT_XYPLOT(xyplot), data);
4858 gabedit_xyplot_add_data (GABEDIT_XYPLOT(xyplot), data);
4859 }
4860 return TRUE;
4861 }
4862 /****************************************************************************************/
gabedit_xyplot_read_gabedit(GtkWidget * xyplot,gchar * fileName)4863 static gboolean gabedit_xyplot_read_gabedit(GtkWidget* xyplot, gchar* fileName)
4864 {
4865 gchar t[BSIZE];
4866 FILE* file = fopen(fileName, "rb");
4867 if(!file)
4868 {
4869 GtkWidget* dialog = NULL;
4870 gchar* tmp = g_strdup_printf(_("Sorry, I cannot open %s file"),fileName);
4871 dialog = gtk_message_dialog_new_with_markup (NULL,
4872 GTK_DIALOG_DESTROY_WITH_PARENT,
4873 GTK_MESSAGE_INFO, GTK_BUTTONS_OK,
4874 "%s",
4875 tmp);
4876 gtk_dialog_run (GTK_DIALOG (dialog));
4877 gtk_widget_destroy (dialog);
4878 g_free(tmp);
4879 return FALSE;
4880 }
4881 if(!fgets(t,BSIZE,file)) return FALSE;
4882 uppercase(t);
4883 if(!strstr(t,"[GABEDIT FORMAT]"))
4884 {
4885 xyplot_message(_("This is not a Gabedit file\n"));
4886 fclose(file);
4887 return FALSE;
4888 }
4889 while(!feof(file))
4890 {
4891 if(!fgets(t,BSIZE,file))
4892 {
4893 fclose(file);
4894 return FALSE;
4895 }
4896 if(strstr(t,"[XYPLOT]"))
4897 {
4898 gabedit_xyplot_read_gabedit_parameters(GABEDIT_XYPLOT(xyplot), file);
4899 gabedit_xyplot_read_gabedit_texts(GABEDIT_XYPLOT(xyplot), file);
4900 gabedit_xyplot_read_gabedit_lines(GABEDIT_XYPLOT(xyplot), file);
4901 gabedit_xyplot_read_gabedit_images(GABEDIT_XYPLOT(xyplot), file);
4902 gabedit_xyplot_read_gabedit_datas(GABEDIT_XYPLOT(xyplot), file);
4903 fclose(file);
4904 return TRUE;
4905 }
4906 }
4907 xyplot_message(_("I can not read the XYPlot data\n"));
4908 fclose(file);
4909 return FALSE;
4910 }
4911 /**************************************************************************/
readAGabedit(GtkFileChooser * SelecFile,gint response_id)4912 static void readAGabedit(GtkFileChooser *SelecFile, gint response_id)
4913 {
4914 gchar *fileName;
4915 GtkWidget* xyplot = g_object_get_data (G_OBJECT (SelecFile), "XYPLOT");
4916
4917 if(response_id != GTK_RESPONSE_OK) return;
4918 if(!GABEDIT_IS_XYPLOT(xyplot)) return;
4919 fileName = gtk_file_chooser_get_filename(SelecFile);
4920 gabedit_xyplot_read_gabedit(xyplot, fileName);
4921 gtk_widget_queue_draw(GTK_WIDGET(xyplot));
4922 }
4923 /********************************************************************************/
readAGabeditDlg(GtkWidget * xyplot)4924 static void readAGabeditDlg(GtkWidget* xyplot)
4925 {
4926 GtkFileFilter *filter;
4927 GtkWidget *dialog;
4928 GtkWidget *parentWindow;
4929
4930 dialog = g_object_new (GTK_TYPE_FILE_CHOOSER_DIALOG, "action", GTK_FILE_CHOOSER_ACTION_OPEN, "file-system-backend", "gtk+", "select-multiple", FALSE, NULL);
4931 gtk_window_set_title (GTK_WINDOW (dialog), _("Read a Gabedit file"));
4932 gtk_dialog_add_buttons (GTK_DIALOG (dialog), GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_OK, NULL);
4933
4934 filter = gtk_file_filter_new ();
4935
4936 gtk_file_filter_set_name (filter, "*.gab");
4937 gtk_file_filter_add_pattern (filter, "*.gab");
4938 gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), filter);
4939
4940 gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK);
4941 g_signal_connect (dialog, "response", G_CALLBACK (readAGabedit),GTK_OBJECT(dialog));
4942 g_signal_connect (dialog, "response", G_CALLBACK (gtk_widget_destroy),GTK_OBJECT(dialog));
4943
4944 g_object_set_data (G_OBJECT (dialog), "XYPLOT",xyplot);
4945 gtk_window_set_modal (GTK_WINDOW (dialog), TRUE);
4946 parentWindow = get_parent_window(GTK_WIDGET(xyplot));
4947 if(parentWindow) gtk_window_set_transient_for(GTK_WINDOW(dialog),GTK_WINDOW(parentWindow));
4948 gtk_widget_show(dialog);
4949 }
4950 /********************************************************************************/
Waiting(gdouble tsecond)4951 static void Waiting(gdouble tsecond)
4952 {
4953 GTimer *timer;
4954 gdouble elaps;
4955 gulong m ;
4956
4957 timer =g_timer_new( );
4958 g_timer_start( timer );
4959 g_timer_reset( timer );
4960 do{
4961 elaps = g_timer_elapsed( timer,&m);
4962 }while(elaps<tsecond);
4963 g_timer_destroy(timer);
4964 }
4965 /**************************************************************************/
copyImageToClipBoard(GtkWidget * xyplot)4966 static void copyImageToClipBoard(GtkWidget* xyplot)
4967 {
4968 if(!GABEDIT_IS_XYPLOT(xyplot)) return;
4969 gtk_widget_hide(xyplot);
4970 gtk_widget_show(xyplot);
4971 while( gtk_events_pending() ) gtk_main_iteration();
4972
4973 gabedit_xyplot_save_image(GABEDIT_XYPLOT(xyplot), NULL, NULL);
4974 }
4975 /**************************************************************************/
saveImage(GtkFileChooser * SelecFile,gint response_id)4976 static void saveImage(GtkFileChooser *SelecFile, gint response_id)
4977 {
4978 gchar *fileName;
4979 GtkWidget* xyplot = g_object_get_data (G_OBJECT (SelecFile), "XYPLOT");
4980 gchar* type = g_object_get_data (G_OBJECT (SelecFile), "ImageType");
4981
4982 if(response_id != GTK_RESPONSE_OK) return;
4983
4984 fileName = gtk_file_chooser_get_filename(SelecFile);
4985 gtk_widget_hide(GTK_WIDGET(SelecFile));
4986 while( gtk_events_pending() ) gtk_main_iteration();
4987 Waiting(1.0);
4988
4989 if(!GABEDIT_IS_XYPLOT(xyplot)) return;
4990 gtk_widget_hide(xyplot);
4991 gtk_widget_show(xyplot);
4992 while( gtk_events_pending() ) gtk_main_iteration();
4993
4994 gabedit_xyplot_save_image(GABEDIT_XYPLOT(xyplot), fileName, type);
4995 }
4996 /********************************************************************************/
saveImageDlg(GtkWidget * xyplot,gchar * type)4997 static void saveImageDlg(GtkWidget* xyplot, gchar* type)
4998 {
4999 GtkFileFilter *filter;
5000 GtkWidget *dialog;
5001 gchar* tmp = NULL;
5002 GtkWidget *parentWindow;
5003
5004 dialog = g_object_new (GTK_TYPE_FILE_CHOOSER_DIALOG, "action", GTK_FILE_CHOOSER_ACTION_SAVE, "file-system-backend", "gtk+", "select-multiple", FALSE, NULL);
5005 gtk_window_set_title (GTK_WINDOW (dialog), _("Save XY plot"));
5006 gtk_dialog_add_buttons (GTK_DIALOG (dialog), GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_SAVE, GTK_RESPONSE_OK, NULL);
5007 filter = gtk_file_filter_new ();
5008
5009 tmp = g_strdup_printf("*.%s",type);
5010 gtk_file_filter_set_name (filter, tmp);
5011 gtk_file_filter_add_pattern (filter, tmp);
5012 gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), filter);
5013 g_free(tmp);
5014
5015
5016 gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK);
5017 g_signal_connect (dialog, "response", G_CALLBACK (saveImage),GTK_OBJECT(dialog));
5018 g_signal_connect (dialog, "response", G_CALLBACK (gtk_widget_destroy),GTK_OBJECT(dialog));
5019 g_object_set_data(G_OBJECT (dialog), "ImageType", type);
5020 if(!strcmp(type,"tpng"))
5021 tmp = g_strdup_printf("xyplot.png");
5022 else
5023 tmp = g_strdup_printf("xyplot.%s",type);
5024 gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER (dialog),tmp);
5025 g_free(tmp);
5026
5027 g_object_set_data (G_OBJECT (dialog), "XYPLOT",xyplot);
5028 gtk_window_set_modal (GTK_WINDOW (dialog), TRUE);
5029 parentWindow = get_parent_window(GTK_WIDGET(xyplot));
5030 if(parentWindow) gtk_window_set_transient_for(GTK_WINDOW(dialog),GTK_WINDOW(parentWindow));
5031 gtk_widget_show(dialog);
5032 }
5033 /*****************************************************************************/
force_expose(GtkWidget * widget)5034 static void force_expose(GtkWidget* widget)
5035 {
5036 gtk_widget_hide(widget);
5037 gtk_widget_show(widget);
5038 while( gtk_events_pending() ) gtk_main_iteration();
5039 }
5040 /*****************************************************************************/
gabedit_xyplot_export(GabeditXYPlot * xyplot,gchar * fileName,gchar * fileType)5041 static void gabedit_xyplot_export(GabeditXYPlot *xyplot, gchar* fileName, gchar* fileType)
5042 {
5043 GtkWidget* widget = NULL;
5044 g_return_if_fail (xyplot != NULL);
5045 g_return_if_fail (GABEDIT_IS_XYPLOT (xyplot));
5046 g_return_if_fail (fileName != NULL);
5047 g_return_if_fail (fileType != NULL);
5048 widget = GTK_WIDGET(xyplot);
5049 if(!strcmp(fileType,"pdf"))
5050 {
5051
5052 cairo_surface_t *surface;
5053 surface = cairo_pdf_surface_create(fileName, widget->allocation.width, widget->allocation.height);
5054 xyplot->cairo_export = cairo_create(surface);
5055 force_expose(widget);
5056 cairo_show_page(xyplot->cairo_export);
5057 cairo_surface_destroy(surface);
5058 cairo_destroy(xyplot->cairo_export);
5059 xyplot->cairo_export = NULL;
5060 return;
5061 }
5062 else
5063 if(!strcmp(fileType,"ps"))
5064 {
5065
5066 cairo_surface_t *surface;
5067 surface = cairo_ps_surface_create(fileName, widget->allocation.width, widget->allocation.height);
5068 xyplot->cairo_export = cairo_create(surface);
5069 force_expose(widget);
5070 cairo_show_page(xyplot->cairo_export);
5071 cairo_surface_destroy(surface);
5072 cairo_destroy(xyplot->cairo_export);
5073 xyplot->cairo_export = NULL;
5074 return;
5075 }
5076 else
5077 if(!strcmp(fileType,"eps"))
5078 {
5079
5080 cairo_surface_t *surface;
5081 surface = cairo_ps_surface_create(fileName, widget->allocation.width, widget->allocation.height);
5082 cairo_ps_surface_set_eps(surface, TRUE);
5083 xyplot->cairo_export = cairo_create(surface);
5084 force_expose(widget);
5085 cairo_show_page(xyplot->cairo_export);
5086 cairo_surface_destroy(surface);
5087 cairo_destroy(xyplot->cairo_export);
5088 xyplot->cairo_export = NULL;
5089 return;
5090 }
5091 else
5092 if(!strcmp(fileType,"svg"))
5093 {
5094
5095 cairo_surface_t *surface;
5096 surface = cairo_svg_surface_create(fileName, widget->allocation.width, widget->allocation.height);
5097 xyplot->cairo_export = cairo_create(surface);
5098 force_expose(widget);
5099 cairo_show_page(xyplot->cairo_export);
5100 cairo_surface_destroy(surface);
5101 cairo_destroy(xyplot->cairo_export);
5102 xyplot->cairo_export = NULL;
5103 return;
5104 }
5105 }
5106 /**************************************************************************/
exportImage(GtkFileChooser * SelecFile,gint response_id)5107 static void exportImage(GtkFileChooser *SelecFile, gint response_id)
5108 {
5109 gchar *fileName;
5110 GtkWidget* xyplot = g_object_get_data (G_OBJECT (SelecFile), "XYPLOT");
5111 gchar* type = g_object_get_data (G_OBJECT (SelecFile), "ImageType");
5112
5113 if(response_id != GTK_RESPONSE_OK) return;
5114
5115 fileName = gtk_file_chooser_get_filename(SelecFile);
5116 gtk_widget_hide(GTK_WIDGET(SelecFile));
5117 while( gtk_events_pending() ) gtk_main_iteration();
5118 Waiting(1.0);
5119
5120 if(!GABEDIT_IS_XYPLOT(xyplot)) return;
5121 gtk_widget_hide(xyplot);
5122 gtk_widget_show(xyplot);
5123 while( gtk_events_pending() ) gtk_main_iteration();
5124
5125 gabedit_xyplot_export(GABEDIT_XYPLOT(xyplot), fileName, type);
5126 }
5127 /********************************************************************************/
exportImageDlg(GtkWidget * xyplot,gchar * type)5128 static void exportImageDlg(GtkWidget* xyplot, gchar* type)
5129 {
5130 GtkFileFilter *filter;
5131 GtkWidget *dialog;
5132 gchar* tmp = NULL;
5133 GtkWidget *parentWindow;
5134
5135 dialog = g_object_new (GTK_TYPE_FILE_CHOOSER_DIALOG, "action", GTK_FILE_CHOOSER_ACTION_SAVE, "file-system-backend", "gtk+", "select-multiple", FALSE, NULL);
5136 gtk_window_set_title (GTK_WINDOW (dialog), _("Export XY plot"));
5137 gtk_dialog_add_buttons (GTK_DIALOG (dialog), GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_SAVE, GTK_RESPONSE_OK, NULL);
5138 filter = gtk_file_filter_new ();
5139
5140 tmp = g_strdup_printf("*.%s",type);
5141 gtk_file_filter_set_name (filter, tmp);
5142 gtk_file_filter_add_pattern (filter, tmp);
5143 gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), filter);
5144 g_free(tmp);
5145
5146
5147 gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK);
5148 g_signal_connect (dialog, "response", G_CALLBACK (exportImage),GTK_OBJECT(dialog));
5149 g_signal_connect (dialog, "response", G_CALLBACK (gtk_widget_destroy),GTK_OBJECT(dialog));
5150 g_object_set_data(G_OBJECT (dialog), "ImageType", type);
5151 tmp = g_strdup_printf("gabeditExport.%s",type);
5152 gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER (dialog),tmp);
5153 g_free(tmp);
5154
5155 g_object_set_data (G_OBJECT (dialog), "XYPLOT",xyplot);
5156 gtk_window_set_modal (GTK_WINDOW (dialog), TRUE);
5157 parentWindow = get_parent_window(GTK_WIDGET(xyplot));
5158 if(parentWindow) gtk_window_set_transient_for(GTK_WINDOW(dialog),GTK_WINDOW(parentWindow));
5159 gtk_widget_show(dialog);
5160 }
5161 /****************************************************************************************/
spin_line_width_changed_value(GtkSpinButton * spinbutton,gpointer user_data)5162 static void spin_line_width_changed_value(GtkSpinButton *spinbutton, gpointer user_data)
5163 {
5164 if(user_data && G_IS_OBJECT(user_data))
5165 {
5166 GtkWidget* xyplot = GTK_WIDGET(user_data);
5167 XYPlotData* data = g_object_get_data(G_OBJECT (spinbutton), "CurentData");
5168 g_return_if_fail (GABEDIT_IS_XYPLOT (xyplot));
5169 if(data) data->line_width = gtk_spin_button_get_value(spinbutton);
5170 else
5171 {
5172 GList *current_node;
5173 current_node=g_list_first(GABEDIT_XYPLOT(xyplot)->data_list);
5174 for (; current_node!=NULL; current_node=current_node->next)
5175 {
5176 data=(XYPlotData*)current_node->data;
5177 data->line_width = gtk_spin_button_get_value(spinbutton);
5178 }
5179 }
5180 gtk_widget_queue_draw(GTK_WIDGET(xyplot));
5181 }
5182 }
5183 /****************************************************************************************/
spin_line_color_changed_value(GtkColorButton * colorbutton,gpointer user_data)5184 static void spin_line_color_changed_value(GtkColorButton *colorbutton, gpointer user_data)
5185 {
5186 if(user_data && G_IS_OBJECT(user_data))
5187 {
5188 GtkWidget* xyplot = GTK_WIDGET(user_data);
5189 XYPlotData* data = g_object_get_data(G_OBJECT (colorbutton), "CurentData");
5190 GdkColor c;
5191 gtk_color_button_get_color (colorbutton, &c);
5192
5193 g_return_if_fail (GABEDIT_IS_XYPLOT (xyplot));
5194
5195 if(data)
5196 data->line_color = c;
5197 else
5198 {
5199 GList *current_node;
5200 current_node=g_list_first(GABEDIT_XYPLOT(xyplot)->data_list);
5201 for (; current_node!=NULL; current_node=current_node->next)
5202 {
5203 data=(XYPlotData*)current_node->data;
5204 data->line_color = c;
5205 }
5206 }
5207 gtk_widget_queue_draw(GTK_WIDGET(xyplot));
5208 }
5209 }
5210 /********************************************************************************************************/
combo_line_style_changed_value(GtkComboBox * combobox,gpointer user_data)5211 static void combo_line_style_changed_value (GtkComboBox *combobox, gpointer user_data)
5212 {
5213 GtkTreeIter iter;
5214 gchar* d = NULL;
5215
5216 if (gtk_combo_box_get_active_iter (combobox, &iter))
5217 {
5218 GtkTreeModel* model = gtk_combo_box_get_model(combobox);
5219 GtkWidget* xyplot = GTK_WIDGET(user_data);
5220 XYPlotData* data = g_object_get_data(G_OBJECT (combobox), "CurentData");
5221
5222 g_return_if_fail (GABEDIT_IS_XYPLOT (xyplot));
5223
5224 gtk_tree_model_get (model, &iter, 0, &d, -1);
5225 if(!d) return;
5226 if(data)
5227 {
5228 if (!strcmp(d,"Solid") ) { data->line_style = GDK_LINE_SOLID; }
5229 else if (!strcmp(d,"On-Off dashed") ) {data->line_style = GDK_LINE_ON_OFF_DASH; }
5230 else if (!strcmp(d,"Double dashed") ) { data->line_style = GDK_LINE_DOUBLE_DASH;}
5231 }
5232 else
5233 {
5234 GList *current_node;
5235 current_node=g_list_first(GABEDIT_XYPLOT(xyplot)->data_list);
5236 for (; current_node!=NULL; current_node=current_node->next)
5237 {
5238 data=(XYPlotData*)current_node->data;
5239 if (!strcmp(d,"Solid") ) { data->line_style = GDK_LINE_SOLID; }
5240 else if (!strcmp(d,"On-Off dashed") ) {data->line_style = GDK_LINE_ON_OFF_DASH; }
5241 else if (!strcmp(d,"Double dashed") ) { data->line_style = GDK_LINE_DOUBLE_DASH;}
5242 }
5243 }
5244 gtk_widget_queue_draw(GTK_WIDGET(xyplot));
5245 }
5246 }
5247 /****************************************************************************************/
spin_point_size_changed_value(GtkSpinButton * spinbutton,gpointer user_data)5248 static void spin_point_size_changed_value(GtkSpinButton *spinbutton, gpointer user_data)
5249 {
5250 if(user_data && G_IS_OBJECT(user_data))
5251 {
5252 GtkWidget* xyplot = GTK_WIDGET(user_data);
5253 XYPlotData* data = g_object_get_data(G_OBJECT (spinbutton), "CurentData");
5254
5255 g_return_if_fail (GABEDIT_IS_XYPLOT (xyplot));
5256
5257
5258 if(data)
5259 {
5260 data->point_size = gtk_spin_button_get_value(spinbutton);
5261 xyplot_build_points_data(GABEDIT_XYPLOT(xyplot), data);
5262 }
5263 else
5264 {
5265 GList *current_node;
5266 current_node=g_list_first(GABEDIT_XYPLOT(xyplot)->data_list);
5267 for (; current_node!=NULL; current_node=current_node->next)
5268 {
5269 data=(XYPlotData*)current_node->data;
5270 data->point_size = gtk_spin_button_get_value(spinbutton);
5271 xyplot_build_points_data(GABEDIT_XYPLOT(xyplot), data);
5272 }
5273 }
5274 gtk_widget_queue_draw(GTK_WIDGET(xyplot));
5275 }
5276 }
5277 /********************************************************************************************************/
combo_point_style_changed_value(GtkComboBox * combobox,gpointer user_data)5278 static void combo_point_style_changed_value (GtkComboBox *combobox, gpointer user_data)
5279 {
5280 GtkTreeIter iter;
5281 gchar* d = NULL;
5282
5283 if (gtk_combo_box_get_active_iter (combobox, &iter))
5284 {
5285 GtkTreeModel* model = gtk_combo_box_get_model(combobox);
5286 GtkWidget* xyplot = GTK_WIDGET(user_data);
5287 XYPlotData* data = g_object_get_data(G_OBJECT (combobox), "CurentData");
5288
5289 g_return_if_fail (GABEDIT_IS_XYPLOT (xyplot));
5290
5291 gtk_tree_model_get (model, &iter, 0, &d, -1);
5292 if(!d) return;
5293 if(data)
5294 {
5295 sprintf(data->point_str,"%s",d);
5296 xyplot_build_points_data(GABEDIT_XYPLOT(xyplot), data);
5297 }
5298 else
5299 {
5300 GList *current_node;
5301 current_node=g_list_first(GABEDIT_XYPLOT(xyplot)->data_list);
5302 for (; current_node!=NULL; current_node=current_node->next)
5303 {
5304 data=(XYPlotData*)current_node->data;
5305 sprintf(data->point_str,"%s",d);
5306 xyplot_build_points_data(GABEDIT_XYPLOT(xyplot), data);
5307 }
5308 }
5309 gtk_widget_queue_draw(GTK_WIDGET(xyplot));
5310 }
5311 }
5312 /****************************************************************************************/
spin_point_color_changed_value(GtkColorButton * colorbutton,gpointer user_data)5313 static void spin_point_color_changed_value(GtkColorButton *colorbutton, gpointer user_data)
5314 {
5315 if(user_data && G_IS_OBJECT(user_data))
5316 {
5317 GtkWidget* xyplot = GTK_WIDGET(user_data);
5318 XYPlotData* data = g_object_get_data(G_OBJECT (colorbutton), "CurentData");
5319 GdkColor c;
5320
5321 g_return_if_fail (GABEDIT_IS_XYPLOT (xyplot));
5322
5323 gtk_color_button_get_color (colorbutton, &c);
5324
5325 if(data)
5326 {
5327 data->point_color = c;
5328 xyplot_build_points_data(GABEDIT_XYPLOT(xyplot), data);
5329 }
5330 else
5331 {
5332 GList *current_node;
5333 current_node=g_list_first(GABEDIT_XYPLOT(xyplot)->data_list);
5334 for (; current_node!=NULL; current_node=current_node->next)
5335 {
5336 data=(XYPlotData*)current_node->data;
5337 data->point_color = c;
5338 xyplot_build_points_data(GABEDIT_XYPLOT(xyplot), data);
5339 }
5340 }
5341 gtk_widget_queue_draw(GTK_WIDGET(xyplot));
5342 }
5343 }
5344 /********************************************************************************************************/
add_point_types_combo(GtkWidget * hbox,XYPlotData * data)5345 static GtkWidget *add_point_types_combo(GtkWidget *hbox, XYPlotData* data)
5346 {
5347 GtkTreeIter iter;
5348 GtkTreeStore *store;
5349 GtkTreeModel *model;
5350 GtkWidget *combobox;
5351 GtkCellRenderer *renderer;
5352 gint i = 0;
5353 gint k = 0;
5354 /* 0x2605=star, 25C6=BLACK DIAMOND, 0x25B2= black triangle, 0x25B3=white triangle */
5355 /* long int x =0x2605; printf("%d\n",x) in decimal*/
5356 gchar* list [] = {"<span>★</span>","+","x",
5357 "<span>○</span>", "<span>●</span>",
5358 "<span>◘</span>", "<span>◙</span>",
5359 "<span>◆</span>", "<span>◊</span>",
5360 "<span>•</span>",
5361 "<span><b>☼</b></span>",
5362 "<span>△</span>", "<span>▲</span>",
5363 "."
5364 };
5365 gint n = G_N_ELEMENTS (list);
5366
5367 store = gtk_tree_store_new (1,G_TYPE_STRING);
5368
5369 for(i=0;i<n;i++)
5370 {
5371 gtk_tree_store_append (store, &iter, NULL);
5372 gtk_tree_store_set (store, &iter, 0, list[i], -1);
5373 if(!strcmp(list[i],data->point_str)) k = i;
5374 }
5375
5376
5377 model = GTK_TREE_MODEL (store);
5378 combobox = gtk_combo_box_new_with_model (model);
5379 g_object_unref (model);
5380 gtk_box_pack_start (GTK_BOX (hbox), combobox, TRUE, TRUE, 1);
5381 renderer = gtk_cell_renderer_text_new ();
5382 gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combobox), renderer, TRUE);
5383 gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (combobox), renderer, "markup", 0, NULL);
5384
5385 gtk_widget_show(combobox);
5386 gtk_combo_box_set_active (GTK_COMBO_BOX (combobox), k);
5387
5388 return combobox;
5389 }
5390 /********************************************************************************************************/
add_line_types_combo(GtkWidget * hbox)5391 static GtkWidget *add_line_types_combo(GtkWidget *hbox)
5392 {
5393 GtkTreeIter iter;
5394 GtkTreeStore *store;
5395 GtkTreeModel *model;
5396 GtkWidget *combobox;
5397 GtkCellRenderer *renderer;
5398
5399 store = gtk_tree_store_new (1,G_TYPE_STRING);
5400
5401 gtk_tree_store_append (store, &iter, NULL);
5402 gtk_tree_store_set (store, &iter, 0, "Solid", -1);
5403 gtk_tree_store_append (store, &iter, NULL);
5404 gtk_tree_store_set (store, &iter, 0, "On-Off dashed", -1);
5405 gtk_tree_store_append (store, &iter, NULL);
5406 gtk_tree_store_set (store, &iter, 0, "Double dashed", -1);
5407
5408 model = GTK_TREE_MODEL (store);
5409 combobox = gtk_combo_box_new_with_model (model);
5410 g_object_unref (model);
5411 gtk_box_pack_start (GTK_BOX (hbox), combobox, TRUE, TRUE, 1);
5412 renderer = gtk_cell_renderer_text_new ();
5413 gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combobox), renderer, TRUE);
5414 gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (combobox), renderer, "text", 0, NULL);
5415
5416 return combobox;
5417 }
5418 /****************************************************************************************/
evaluate_formula(G_CONST_RETURN gchar * t)5419 static gdouble evaluate_formula(G_CONST_RETURN gchar* t)
5420 {
5421 gdouble a = 1.0;
5422 gchar* pos = strstr(t,"/");
5423 if(pos && pos[1]!='\0') a = atof(t)/atof(pos+1);
5424 else
5425 {
5426 pos = strstr(t,"*");
5427 if(pos && pos[1]!='\0') a = atof(t)*atof(pos+1);
5428 else a = atof(t);
5429 }
5430 return a;
5431 }
5432 /****************************************************************************************/
activate_entry_scale_x(GtkEntry * entry,gpointer user_data)5433 static void activate_entry_scale_x(GtkEntry *entry, gpointer user_data)
5434 {
5435 if(user_data && G_IS_OBJECT(user_data))
5436 {
5437 GtkWidget* xyplot = GTK_WIDGET(user_data);
5438 XYPlotData* data = g_object_get_data(G_OBJECT (entry), "CurentData");
5439 gint loop;
5440 gdouble a;
5441 G_CONST_RETURN gchar* t;
5442
5443 g_return_if_fail (GABEDIT_IS_XYPLOT (xyplot));
5444
5445 t= gtk_entry_get_text(GTK_ENTRY(entry));
5446 if(!t) return;
5447 a = evaluate_formula(t);
5448 if(data)
5449 for(loop=0;loop<data->size; loop++) data->x[loop] *= a;
5450 else
5451 {
5452 GList *current_node;
5453 current_node=g_list_first(GABEDIT_XYPLOT(xyplot)->data_list);
5454 for (; current_node!=NULL; current_node=current_node->next)
5455 {
5456 data=(XYPlotData*)current_node->data;
5457 for(loop=0;loop<data->size; loop++) data->x[loop] *= a;
5458 }
5459 }
5460 gtk_entry_set_text(GTK_ENTRY(entry),"1.0");
5461 gtk_editable_set_position(GTK_EDITABLE(entry),3);
5462 gtk_widget_queue_draw(GTK_WIDGET(xyplot));
5463 }
5464 }
5465 /****************************************************************************************/
activate_entry_scale_y(GtkEntry * entry,gpointer user_data)5466 static void activate_entry_scale_y(GtkEntry *entry, gpointer user_data)
5467 {
5468 if(user_data && G_IS_OBJECT(user_data))
5469 {
5470 GtkWidget* xyplot = GTK_WIDGET(user_data);
5471 XYPlotData* data = g_object_get_data(G_OBJECT (entry), "CurentData");
5472 gint loop;
5473 gdouble a;
5474 G_CONST_RETURN gchar* t;
5475 g_return_if_fail (GABEDIT_IS_XYPLOT (xyplot));
5476 t= gtk_entry_get_text(GTK_ENTRY(entry));
5477 if(!t) return;
5478 a = evaluate_formula(t);
5479 if(data)
5480 for(loop=0;loop<data->size; loop++) data->y[loop] *= a;
5481 else
5482 {
5483 GList *current_node;
5484 current_node=g_list_first(GABEDIT_XYPLOT(xyplot)->data_list);
5485 for (; current_node!=NULL; current_node=current_node->next)
5486 {
5487 data=(XYPlotData*)current_node->data;
5488 for(loop=0;loop<data->size; loop++) data->y[loop] *= a;
5489 }
5490 }
5491 gtk_entry_set_text(GTK_ENTRY(entry),"1.0");
5492 gtk_editable_set_position(GTK_EDITABLE(entry),3);
5493 gtk_widget_queue_draw(GTK_WIDGET(xyplot));
5494 }
5495 }
5496 /****************************************************************************************/
activate_entry_shift_x(GtkEntry * entry,gpointer user_data)5497 static void activate_entry_shift_x(GtkEntry *entry, gpointer user_data)
5498 {
5499 if(user_data && G_IS_OBJECT(user_data))
5500 {
5501 GtkWidget* xyplot = GTK_WIDGET(user_data);
5502 XYPlotData* data = g_object_get_data(G_OBJECT (entry), "CurentData");
5503 gint loop;
5504 gdouble a;
5505 G_CONST_RETURN gchar* t;
5506 g_return_if_fail (GABEDIT_IS_XYPLOT (xyplot));
5507 t= gtk_entry_get_text(GTK_ENTRY(entry));
5508 if(!t) return;
5509 a = evaluate_formula(t);
5510 if(data)
5511 for(loop=0;loop<data->size; loop++) data->x[loop] += a;
5512 else
5513 {
5514 GList *current_node;
5515 current_node=g_list_first(GABEDIT_XYPLOT(xyplot)->data_list);
5516 for (; current_node!=NULL; current_node=current_node->next)
5517 {
5518 data=(XYPlotData*)current_node->data;
5519 for(loop=0;loop<data->size; loop++) data->x[loop] += a;
5520 }
5521 }
5522 gtk_entry_set_text(GTK_ENTRY(entry),"0.0");
5523 gtk_editable_set_position(GTK_EDITABLE(entry),3);
5524 gtk_widget_queue_draw(GTK_WIDGET(xyplot));
5525 }
5526 }
5527 /****************************************************************************************/
activate_entry_shift_y(GtkEntry * entry,gpointer user_data)5528 static void activate_entry_shift_y(GtkEntry *entry, gpointer user_data)
5529 {
5530 if(user_data && G_IS_OBJECT(user_data))
5531 {
5532 GtkWidget* xyplot = GTK_WIDGET(user_data);
5533 XYPlotData* data = g_object_get_data(G_OBJECT (entry), "CurentData");
5534 gint loop;
5535 gdouble a;
5536 G_CONST_RETURN gchar* t;
5537 g_return_if_fail (GABEDIT_IS_XYPLOT (xyplot));
5538 t= gtk_entry_get_text(GTK_ENTRY(entry));
5539 if(!t) return;
5540 a = evaluate_formula(t);
5541 if(data)
5542 for(loop=0;loop<data->size; loop++) data->y[loop] += a;
5543 else
5544 {
5545 GList *current_node;
5546 current_node=g_list_first(GABEDIT_XYPLOT(xyplot)->data_list);
5547 for (; current_node!=NULL; current_node=current_node->next)
5548 {
5549 data=(XYPlotData*)current_node->data;
5550 for(loop=0;loop<data->size; loop++) data->y[loop] += a;
5551 }
5552 }
5553 gtk_entry_set_text(GTK_ENTRY(entry),"0.0");
5554 gtk_editable_set_position(GTK_EDITABLE(entry),3);
5555 gtk_widget_queue_draw(GTK_WIDGET(xyplot));
5556 }
5557 }
5558 /****************************************************************************************/
build_filter(GtkWidget * buttonFilter,gpointer user_data)5559 static void build_filter(GtkWidget* buttonFilter, gpointer user_data)
5560 {
5561 if(user_data && G_IS_OBJECT(user_data))
5562 {
5563 gdouble sigma = 10.0;
5564 G_CONST_RETURN gchar* t;
5565 GtkWidget* xyplot = GTK_WIDGET(user_data);
5566 XYPlotData* data = g_object_get_data(G_OBJECT (xyplot), "CurentData");
5567 GtkWidget* parentWindow = ( GtkWidget*) g_object_get_data(G_OBJECT (buttonFilter), "ParentWindow");
5568 GtkWidget* entry_sigma = ( GtkWidget*) g_object_get_data(G_OBJECT (xyplot), "EntrySigma");
5569 GtkWidget* popup = NULL;
5570 GtkComboBox *combo_filter = ( GtkComboBox*) g_object_get_data(G_OBJECT (xyplot), "ComboFilter");
5571 GtkTreeIter iter;
5572 gchar* filter = NULL;
5573
5574 g_return_if_fail (GABEDIT_IS_XYPLOT (xyplot));
5575 g_return_if_fail (GTK_IS_ENTRY (entry_sigma));
5576
5577 if(parentWindow) gtk_widget_hide (GTK_WIDGET(parentWindow));
5578 while(gtk_events_pending()) gtk_main_iteration();
5579 popup = create_popup_win(_("Please wait"));
5580
5581 if (gtk_combo_box_get_active_iter (combo_filter, &iter))
5582 {
5583 GtkTreeModel* model = gtk_combo_box_get_model(combo_filter);
5584 gtk_tree_model_get (model, &iter, 0, &filter, -1);
5585 }
5586 if(filter && strstr(filter,"Gaussian"))
5587 {
5588 t= gtk_entry_get_text(GTK_ENTRY(entry_sigma));
5589 sigma = atof(t);
5590 if(sigma==0) sigma = 1;
5591 sigma *=0.5;
5592 }
5593 if(data && data->size>2 && data->x && data->y)
5594 {
5595 gdouble* X = g_malloc(data->size*sizeof(gdouble));
5596 gdouble* Y = g_malloc(data->size*sizeof(gdouble));
5597 gint i;
5598 GtkWidget* window = NULL;
5599 GtkWidget* xyplot = NULL;
5600 gint N = data->size;
5601 gdouble xmin;
5602 gdouble xmax;
5603 gdouble* x = NULL;
5604 gdouble* y = NULL;
5605 gdouble xm = 0.0;
5606
5607 x = data->x;
5608 y = data->y;
5609 xmin = x[0];
5610 xmax = x[0];
5611 for(i=0;i<N; i++)
5612 {
5613 X[i] = x[i];
5614 Y[i] = y[i];
5615 if(xmin>x[i]) xmin = x[i];
5616 if(xmax<x[i]) xmax = x[i];
5617 }
5618 xmax = (xmax-xmin);
5619 xm = xmax/2;
5620 if(filter)
5621 {
5622 gint n = 3;
5623 gdouble alpha = 0.16;
5624 gdouble a[5] = {(1-alpha)/2,0.5,alpha/2,0.0,0.0};/* Blackman coefs */
5625 for(i=0;i<N; i++) X[i] = (X[i]-xmin-xm)/xmax;
5626 if(strstr(filter,"Nuttall")&& !strstr(filter,"-"))
5627 {
5628 a[0] = 0.355768;
5629 a[1] = 0.487396;
5630 a[2] = 0.144232;
5631 a[3] = 0.012604;
5632 n = 4;
5633 }
5634 if(strstr(filter,"Blackman–Harris"))
5635 {
5636 a[0] = 0.35875 ;
5637 a[1] = 0.48829 ;
5638 a[2] = 0.14128 ;
5639 a[3] = 0.01168 ;
5640 n = 4;
5641 }
5642 if(strstr(filter,"Blackman–Nuttall"))
5643 {
5644 a[0] = 0.3635819;
5645 a[1] = 0.4891775;
5646 a[2] = 0.1365995;
5647 a[3] = 0.0106411;
5648 n = 4;
5649 }
5650 if(strstr(filter,"Flat-Top"))
5651 {
5652 a[0] = 1.0;
5653 a[1] = 1.93;
5654 a[2] = 1.29;
5655 a[3] = 0.388;
5656 a[4] = 0.032;
5657 n = 5;
5658 }
5659 if(strstr(filter,"Gaussian")) for(i=0;i<N; i++) Y[i] = Y[i]*exp(-X[i]*X[i]*sigma);
5660 else
5661 {
5662 /* gdouble norm = 0;*/
5663 for(i=0;i<N; i++)
5664 {
5665 gdouble c = a[0];
5666 gdouble b = X[i];
5667 gint j;
5668 for(j=1;j<n; j++) c += a[j]*cos(2*M_PI*b*j);
5669 Y[i] = Y[i]*c;
5670 /* norm+= c;*/
5671 }
5672 /* printf("norm = %lf\n",norm);*/
5673 }
5674 for(i=0;i<N; i++) X[i] = X[i]*xmax+xmin+xm;
5675 }
5676
5677 window = gabedit_xyplot_new_window(_("Filter"),NULL);
5678 xyplot = g_object_get_data(G_OBJECT (window), "XYPLOT");
5679 xyplot_curve_noconv(GABEDIT_XYPLOT(xyplot), N, X, Y, NULL);
5680 gabedit_xyplot_set_range_xmin (GABEDIT_XYPLOT(xyplot), 0.0);
5681 gabedit_xyplot_set_x_label (GABEDIT_XYPLOT(xyplot), " ");
5682 }
5683 if(parentWindow) gtk_object_destroy (GTK_OBJECT(parentWindow));
5684 if(popup) gtk_object_destroy(GTK_OBJECT(popup));
5685 }
5686 }
5687 /********************************************************************************************************/
add_combo_filter(GtkWidget * hbox)5688 static GtkWidget *add_combo_filter(GtkWidget *hbox)
5689 {
5690 GtkTreeIter iter;
5691 GtkTreeStore *store;
5692 GtkTreeModel *model;
5693 GtkWidget *combobox;
5694 GtkCellRenderer *renderer;
5695
5696 store = gtk_tree_store_new (1,G_TYPE_STRING);
5697
5698 gtk_tree_store_append (store, &iter, NULL);
5699 gtk_tree_store_set (store, &iter, 0, "Gaussian : exp(-0.5 sigma (t/tmax)^2)", -1);
5700 gtk_tree_store_append (store, &iter, NULL);
5701 gtk_tree_store_set (store, &iter, 0, "Blackman", -1);
5702 gtk_tree_store_append (store, &iter, NULL);
5703 gtk_tree_store_set (store, &iter, 0, "Nuttall", -1);
5704 gtk_tree_store_append (store, &iter, NULL);
5705 gtk_tree_store_set (store, &iter, 0, "Blackman–Harris", -1);
5706 gtk_tree_store_append (store, &iter, NULL);
5707 gtk_tree_store_set (store, &iter, 0, "Blackman–Nuttall", -1);
5708 gtk_tree_store_append (store, &iter, NULL);
5709 gtk_tree_store_set (store, &iter, 0, "Flat-Top", -1);
5710
5711 model = GTK_TREE_MODEL (store);
5712 combobox = gtk_combo_box_new_with_model (model);
5713 g_object_unref (model);
5714 gtk_box_pack_start (GTK_BOX (hbox), combobox, TRUE, TRUE, 1);
5715 renderer = gtk_cell_renderer_text_new ();
5716 gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combobox), renderer, TRUE);
5717 gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (combobox), renderer, "text", 0, NULL);
5718
5719 return combobox;
5720 }
5721 /********************************************************************************/
add_filter_data_frame(GtkWidget * hbox,GtkWidget * xyplot,XYPlotData * data,GtkWidget * parentWindow)5722 static void add_filter_data_frame(GtkWidget* hbox, GtkWidget* xyplot, XYPlotData *data, GtkWidget* parentWindow)
5723 {
5724 GtkWidget* frame = NULL;
5725 GtkWidget* vbox_frame = NULL;
5726 GtkWidget* hbox_frame = NULL;
5727 GtkWidget* label = NULL;
5728 GtkWidget* entry_sigma = NULL;
5729 GtkWidget* buttonFilter = NULL;
5730 GtkWidget* combo = NULL;
5731 gchar tmp[100];
5732
5733 frame=gtk_frame_new(_("Filter"));
5734 gtk_box_pack_start(GTK_BOX(hbox), frame, FALSE, TRUE, 2);
5735 gtk_widget_show(frame);
5736
5737 vbox_frame=gtk_vbox_new(FALSE, 0);
5738 gtk_container_add(GTK_CONTAINER(frame), vbox_frame);
5739 gtk_widget_show(vbox_frame);
5740
5741 hbox_frame=gtk_hbox_new(FALSE, 0);
5742 gtk_box_pack_start(GTK_BOX(vbox_frame), hbox_frame, FALSE, FALSE, 2);
5743 gtk_widget_show(hbox_frame);
5744
5745 label=gtk_label_new(_("Type :"));
5746 gtk_box_pack_start(GTK_BOX(hbox_frame), label, TRUE, FALSE, 2);
5747 gtk_widget_show(label);
5748
5749 combo = add_combo_filter(hbox_frame);
5750 gtk_combo_box_set_active (GTK_COMBO_BOX (combo), 0);
5751 gtk_widget_show(combo);
5752 g_object_set_data(G_OBJECT (xyplot), "ComboFilter", combo);
5753
5754 /* g_signal_connect(G_OBJECT(combo), "changed", G_CALLBACK(NULL), xyplot);*/
5755
5756 label=gtk_label_new(_("Sigma : "));
5757 gtk_box_pack_start(GTK_BOX(hbox_frame), label, FALSE, FALSE, 2);
5758 gtk_widget_show(label);
5759 g_object_set_data(G_OBJECT ( xyplot), "LabelSigma", label);
5760
5761 entry_sigma = gtk_entry_new();
5762 gtk_widget_set_size_request(entry_sigma,80,-1);
5763 sprintf(tmp,"%0.2f",10.0);
5764 gtk_entry_set_text(GTK_ENTRY(entry_sigma),tmp);
5765 gtk_box_pack_start(GTK_BOX(hbox_frame), entry_sigma, FALSE, FALSE, 2);
5766 gtk_widget_show(entry_sigma);
5767 g_object_set_data(G_OBJECT ( xyplot), "EntrySigma", entry_sigma);
5768
5769 buttonFilter = gtk_button_new_with_label (_("Apply"));
5770 gtk_box_pack_start(GTK_BOX(hbox_frame), buttonFilter, TRUE, TRUE, 4);
5771 gtk_widget_show (buttonFilter);
5772
5773 g_object_set_data(G_OBJECT ( xyplot), "CurentData", data);
5774 g_object_set_data(G_OBJECT (buttonFilter), "ParentWindow", parentWindow);
5775
5776 g_signal_connect(G_OBJECT(buttonFilter), "clicked", G_CALLBACK(build_filter), xyplot);
5777
5778 }
5779 /****************************************************************************************/
set_data_dialog(GabeditXYPlot * xyplot,XYPlotData * data)5780 static void set_data_dialog(GabeditXYPlot* xyplot, XYPlotData* data)
5781 {
5782 GtkWidget* window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
5783 GtkWidget* frame = NULL;
5784 GtkWidget* hbox = NULL;
5785 GtkWidget* hbox1 = NULL;
5786 GtkWidget* label = NULL;
5787 GtkWidget* combo = NULL;
5788 GtkWidget* combo_point = NULL;
5789 GtkWidget* spin = NULL;
5790 GtkWidget* button = NULL;
5791 GtkWidget* spin_point = NULL;
5792 GtkWidget* button_point = NULL;
5793 GtkWidget* buttonSave = NULL;
5794 GtkWidget* buttonRemove = NULL;
5795 GtkWidget* buttonMax1 = NULL;
5796 GtkWidget* buttonAutoRanges = NULL;
5797 GtkWidget* buttonAutoRangesAll = NULL;
5798 GtkWidget* parentWindow = NULL;
5799 GtkWidget* vbox_window = NULL;
5800 GtkWidget* entry_scale_x = NULL;
5801 GtkWidget* entry_scale_y = NULL;
5802 GtkWidget* entry_shift_x = NULL;
5803 GtkWidget* entry_shift_y = NULL;
5804
5805 gtk_window_set_title (GTK_WINDOW (window), _("Set data options"));
5806 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
5807 gtk_window_set_modal (GTK_WINDOW (window), TRUE);
5808
5809 g_signal_connect(G_OBJECT(window), "delete_event", G_CALLBACK(destroy_data_dialog), (gpointer)xyplot);
5810
5811 vbox_window=gtk_vbox_new(FALSE, 0);
5812 gtk_container_add(GTK_CONTAINER(window), vbox_window);
5813 gtk_widget_show(vbox_window);
5814
5815 hbox1=gtk_hbox_new(FALSE, 0);
5816 gtk_box_pack_start(GTK_BOX(vbox_window), hbox1, TRUE, FALSE, 2);
5817 gtk_widget_show(hbox1);
5818
5819 frame = gtk_frame_new(_("Set line type"));
5820 gtk_box_pack_start(GTK_BOX(hbox1), frame, TRUE, FALSE, 2);
5821 gtk_widget_show(frame);
5822
5823 hbox=gtk_hbox_new(FALSE, 0);
5824 gtk_container_add(GTK_CONTAINER(frame), hbox);
5825 gtk_widget_show(hbox);
5826
5827 label=gtk_label_new(_("Line width :"));
5828 gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, FALSE, 2);
5829 gtk_widget_show(label);
5830
5831 spin = gtk_spin_button_new_with_range(0, 10, 1);
5832 gtk_spin_button_set_value(GTK_SPIN_BUTTON(spin), data->line_width);
5833 gtk_box_pack_start(GTK_BOX(hbox), spin, TRUE, FALSE, 2);
5834 gtk_widget_show(spin);
5835 g_object_set_data(G_OBJECT (window), "SpinLineWidth", spin);
5836
5837 label=gtk_label_new(_("Line type :"));
5838 gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, FALSE, 2);
5839 gtk_widget_show(label);
5840
5841 combo = add_line_types_combo(hbox);
5842 gtk_combo_box_set_active (GTK_COMBO_BOX (combo), 0);
5843 if(data->line_style == GDK_LINE_SOLID) gtk_combo_box_set_active (GTK_COMBO_BOX (combo), 0);
5844 else if(data->line_style == GDK_LINE_ON_OFF_DASH) gtk_combo_box_set_active (GTK_COMBO_BOX (combo), 1);
5845 else if(data->line_style == GDK_LINE_DOUBLE_DASH) gtk_combo_box_set_active (GTK_COMBO_BOX (combo), 2);
5846 gtk_widget_show(combo);
5847 g_object_set_data(G_OBJECT (window), "ComboLineType", combo);
5848
5849 label=gtk_label_new(_("Line color :"));
5850 gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, FALSE, 2);
5851 gtk_widget_show(label);
5852
5853 button = gtk_color_button_new_with_color (&data->line_color);
5854 gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, FALSE, 2);
5855 gtk_widget_show(button);
5856 g_object_set_data(G_OBJECT (window), "ColorButton", button);
5857
5858 frame = gtk_frame_new(_("Set point type"));
5859 gtk_box_pack_start(GTK_BOX(vbox_window), frame, TRUE, FALSE, 2);
5860 gtk_widget_show(frame);
5861
5862 hbox=gtk_hbox_new(FALSE, 0);
5863 gtk_container_add(GTK_CONTAINER(frame), hbox);
5864 gtk_widget_show(hbox);
5865
5866 label=gtk_label_new(_("Point size :"));
5867 gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, FALSE, 2);
5868 gtk_widget_show(label);
5869
5870 spin_point = gtk_spin_button_new_with_range(0, 30, 1);
5871 gtk_spin_button_set_value(GTK_SPIN_BUTTON(spin_point), data->point_size);
5872 gtk_box_pack_start(GTK_BOX(hbox), spin_point, TRUE, FALSE, 2);
5873 gtk_widget_show(spin_point);
5874 g_object_set_data(G_OBJECT (window), "SpinPointWidth", spin_point);
5875
5876 label=gtk_label_new(_("Point type :"));
5877 gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, FALSE, 2);
5878 gtk_widget_show(label);
5879
5880 combo_point = add_point_types_combo(hbox, data);
5881 gtk_widget_show(combo_point);
5882 g_object_set_data(G_OBJECT (window), "ComboPointType", combo_point);
5883
5884 label=gtk_label_new(_("Point color :"));
5885 gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, FALSE, 2);
5886 gtk_widget_show(label);
5887
5888 button_point = gtk_color_button_new_with_color (&data->point_color);
5889 gtk_box_pack_start(GTK_BOX(hbox), button_point, TRUE, FALSE, 2);
5890 gtk_widget_show(button_point);
5891 g_object_set_data(G_OBJECT (window), "ColorButton", button_point);
5892
5893
5894 frame = gtk_frame_new(NULL);
5895 gtk_box_pack_start(GTK_BOX(vbox_window), frame, TRUE, FALSE, 2);
5896 gtk_widget_show(frame);
5897
5898 hbox=gtk_hbox_new(FALSE, 0);
5899 gtk_container_add(GTK_CONTAINER(frame), hbox);
5900 gtk_widget_show(hbox);
5901
5902
5903 label=gtk_label_new(_("Scale X : "));
5904 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 2);
5905 gtk_widget_show(label);
5906
5907 entry_scale_x = gtk_entry_new();
5908 gtk_widget_set_size_request(entry_scale_x,50,-1);
5909 gtk_entry_set_text(GTK_ENTRY(entry_scale_x),"1.0");
5910 gtk_box_pack_start(GTK_BOX(hbox), entry_scale_x, FALSE, FALSE, 2);
5911 gtk_widget_show(entry_scale_x);
5912
5913 label=gtk_label_new(_("Scale Y : "));
5914 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 2);
5915 gtk_widget_show(label);
5916
5917 entry_scale_y = gtk_entry_new();
5918 gtk_widget_set_size_request(entry_scale_y,50,-1);
5919 gtk_entry_set_text(GTK_ENTRY(entry_scale_y),"1.0");
5920 gtk_box_pack_start(GTK_BOX(hbox), entry_scale_y, FALSE, FALSE, 2);
5921 gtk_widget_show(entry_scale_y);
5922
5923 label=gtk_label_new(_("Shift X : "));
5924 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 2);
5925 gtk_widget_show(label);
5926
5927 entry_shift_x = gtk_entry_new();
5928 gtk_widget_set_size_request(entry_shift_x,50,-1);
5929 gtk_entry_set_text(GTK_ENTRY(entry_shift_x),"0.0");
5930 gtk_box_pack_start(GTK_BOX(hbox), entry_shift_x, FALSE, FALSE, 2);
5931 gtk_widget_show(entry_shift_x);
5932
5933 label=gtk_label_new(_("Shift Y : "));
5934 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 2);
5935 gtk_widget_show(label);
5936
5937
5938 entry_shift_y = gtk_entry_new();
5939 gtk_widget_set_size_request(entry_shift_y,50,-1);
5940 gtk_entry_set_text(GTK_ENTRY(entry_shift_y),"0.0");
5941 gtk_box_pack_start(GTK_BOX(hbox), entry_shift_y, FALSE, FALSE, 2);
5942 gtk_widget_show(entry_shift_y);
5943
5944 frame = gtk_frame_new(NULL);
5945 gtk_box_pack_start(GTK_BOX(vbox_window), frame, TRUE, FALSE, 2);
5946 gtk_widget_show(frame);
5947
5948 hbox=gtk_hbox_new(FALSE, 0);
5949 gtk_container_add(GTK_CONTAINER(frame), hbox);
5950 gtk_widget_show(hbox);
5951
5952 buttonAutoRanges = gtk_button_new_with_label (_("Auto ranges"));
5953 gtk_box_pack_start(GTK_BOX(hbox), buttonAutoRanges, TRUE, TRUE, 4);
5954 gtk_widget_show (buttonAutoRanges);
5955
5956 buttonAutoRangesAll = gtk_button_new_with_label (_("Auto ranges all"));
5957 gtk_box_pack_start(GTK_BOX(hbox), buttonAutoRangesAll, TRUE, TRUE, 4);
5958 gtk_widget_show (buttonAutoRangesAll);
5959
5960
5961 buttonSave = gtk_button_new_with_label (_("Save"));
5962 gtk_box_pack_start(GTK_BOX(hbox), buttonSave, TRUE, TRUE, 4);
5963 gtk_widget_show (buttonSave);
5964
5965 buttonMax1 = gtk_button_new_with_label (_("Max=1"));
5966 gtk_box_pack_start(GTK_BOX(hbox), buttonMax1, TRUE, TRUE, 4);
5967 gtk_widget_show (buttonMax1);
5968
5969 buttonRemove = gtk_button_new_with_label (_("Remove"));
5970 gtk_box_pack_start(GTK_BOX(hbox), buttonRemove, TRUE, TRUE, 4);
5971 gtk_widget_show (buttonRemove);
5972
5973
5974
5975 g_object_set_data(G_OBJECT (spin), "CurentData", data);
5976 g_signal_connect(G_OBJECT(spin), "value-changed", G_CALLBACK(spin_line_width_changed_value), xyplot);
5977 g_object_set_data(G_OBJECT (button), "CurentData", data);
5978 g_signal_connect(G_OBJECT(button), "color-set", G_CALLBACK(spin_line_color_changed_value), xyplot);
5979 g_signal_connect(G_OBJECT(combo), "changed", G_CALLBACK(combo_line_style_changed_value), xyplot);
5980 g_object_set_data(G_OBJECT (combo), "CurentData", data);
5981
5982 g_signal_connect(G_OBJECT(combo_point), "changed", G_CALLBACK(combo_point_style_changed_value), xyplot);
5983 g_object_set_data(G_OBJECT (combo_point), "CurentData", data);
5984
5985 g_object_set_data(G_OBJECT (spin_point), "CurentData", data);
5986 g_signal_connect(G_OBJECT(spin_point), "value-changed", G_CALLBACK(spin_point_size_changed_value), xyplot);
5987 g_object_set_data(G_OBJECT (button_point), "CurentData", data);
5988 g_signal_connect(G_OBJECT(button_point), "color-set", G_CALLBACK(spin_point_color_changed_value), xyplot);
5989
5990
5991 g_object_set_data(G_OBJECT (buttonSave), "CurentData", data);
5992 g_signal_connect(G_OBJECT(buttonSave), "clicked", G_CALLBACK(save_data_2columns_dlg), xyplot);
5993
5994 g_object_set_data(G_OBJECT (buttonRemove), "CurentData", data);
5995 g_object_set_data(G_OBJECT (buttonRemove), "Window", window);
5996 g_object_set_data(G_OBJECT (buttonRemove), "XYPLOT", xyplot);
5997 g_signal_connect(G_OBJECT(buttonRemove), "clicked", G_CALLBACK(remove_data_dlg), xyplot);
5998
5999 g_object_set_data(G_OBJECT (buttonAutoRanges), "CurentData", data);
6000 g_signal_connect(G_OBJECT(buttonAutoRanges), "clicked", G_CALLBACK(auto_range_activate), xyplot);
6001
6002 g_object_set_data(G_OBJECT (buttonMax1), "CurentData", data);
6003 g_signal_connect(G_OBJECT(buttonMax1), "clicked", G_CALLBACK(set_max_1_activate), xyplot);
6004
6005 g_object_set_data(G_OBJECT (buttonAutoRangesAll), "CurentData", NULL);
6006 g_signal_connect(G_OBJECT(buttonAutoRangesAll), "clicked", G_CALLBACK(auto_range_activate), xyplot);
6007
6008 g_object_set_data(G_OBJECT (entry_scale_x), "CurentData", data);
6009 g_object_set_data(G_OBJECT (entry_scale_y), "CurentData", data);
6010 g_object_set_data(G_OBJECT (entry_shift_x), "CurentData", data);
6011 g_object_set_data(G_OBJECT (entry_shift_y), "CurentData", data);
6012 g_signal_connect (G_OBJECT (entry_scale_x), "activate", (GCallback)activate_entry_scale_x, xyplot);
6013 g_signal_connect (G_OBJECT (entry_scale_y), "activate", (GCallback)activate_entry_scale_y, xyplot);
6014 g_signal_connect (G_OBJECT (entry_shift_x), "activate", (GCallback)activate_entry_shift_x, xyplot);
6015 g_signal_connect (G_OBJECT (entry_shift_y), "activate", (GCallback)activate_entry_shift_y, xyplot);
6016
6017 hbox=gtk_hbox_new(FALSE, 0);
6018 gtk_box_pack_start(GTK_BOX(vbox_window), hbox, TRUE, FALSE, 2);
6019 gtk_widget_show(hbox);
6020 add_cut_data_frame(hbox, GTK_WIDGET(xyplot), data);
6021
6022 add_x_linear_data_frame(hbox, GTK_WIDGET(xyplot), data);
6023
6024 hbox=gtk_hbox_new(FALSE, 0);
6025 gtk_box_pack_start(GTK_BOX(vbox_window), hbox, TRUE, FALSE, 2);
6026 gtk_widget_show(hbox);
6027 add_filter_data_frame(hbox, GTK_WIDGET(xyplot), data, window);
6028
6029 hbox=gtk_hbox_new(FALSE, 0);
6030 gtk_box_pack_start(GTK_BOX(vbox_window), hbox, TRUE, FALSE, 2);
6031 gtk_widget_show(hbox);
6032 add_fourier_data_frame(hbox, GTK_WIDGET(xyplot), data, window);
6033
6034 parentWindow = get_parent_window(GTK_WIDGET(xyplot));
6035 if(parentWindow)
6036 {
6037 gtk_window_set_transient_for(GTK_WINDOW(window),GTK_WINDOW(parentWindow));
6038 }
6039 gtk_widget_show(window);
6040 /* list_utf8();*/
6041
6042
6043 }
6044 /****************************************************************************************/
set_all_data_dlg(GtkWidget * xyplot)6045 static void set_all_data_dlg(GtkWidget* xyplot)
6046 {
6047 GtkWidget* window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6048 GtkWidget* frame = NULL;
6049 GtkWidget* hbox = NULL;
6050 GtkWidget* hbox1 = NULL;
6051 GtkWidget* label = NULL;
6052 GtkWidget* combo = NULL;
6053 GtkWidget* combo_point = NULL;
6054 GtkWidget* spin = NULL;
6055 GtkWidget* button = NULL;
6056 GtkWidget* spin_point = NULL;
6057 GtkWidget* button_point = NULL;
6058 GtkWidget* buttonAutoRangesAll = NULL;
6059 GtkWidget* parentWindow = NULL;
6060 GtkWidget* vbox_window = NULL;
6061 GtkWidget* entry_scale_x = NULL;
6062 GtkWidget* entry_scale_y = NULL;
6063 GtkWidget* entry_shift_x = NULL;
6064 GtkWidget* entry_shift_y = NULL;
6065
6066 GList *current_node;
6067 XYPlotData* data=NULL;
6068
6069 g_return_if_fail (GABEDIT_IS_XYPLOT (xyplot));
6070
6071 current_node=g_list_first(GABEDIT_XYPLOT(xyplot)->data_list);
6072 if(!current_node) return;
6073 data=(XYPlotData*)current_node->data;
6074 if(!data) return;
6075
6076 gtk_window_set_title (GTK_WINDOW (window), _("Set all data"));
6077 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
6078 gtk_window_set_modal (GTK_WINDOW (window), TRUE);
6079
6080 g_signal_connect(G_OBJECT(window), "delete_event", G_CALLBACK(destroy_data_dialog), (gpointer)xyplot);
6081
6082 vbox_window=gtk_vbox_new(FALSE, 0);
6083 gtk_container_add(GTK_CONTAINER(window), vbox_window);
6084 gtk_widget_show(vbox_window);
6085
6086 hbox1=gtk_hbox_new(FALSE, 0);
6087 gtk_box_pack_start(GTK_BOX(vbox_window), hbox1, TRUE, FALSE, 2);
6088 gtk_widget_show(hbox1);
6089
6090 frame = gtk_frame_new(_("Set line type"));
6091 gtk_box_pack_start(GTK_BOX(hbox1), frame, TRUE, FALSE, 2);
6092 gtk_widget_show(frame);
6093
6094 hbox=gtk_hbox_new(FALSE, 0);
6095 gtk_container_add(GTK_CONTAINER(frame), hbox);
6096 gtk_widget_show(hbox);
6097
6098 label=gtk_label_new(_("Line width :"));
6099 gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, FALSE, 2);
6100 gtk_widget_show(label);
6101
6102 spin = gtk_spin_button_new_with_range(0, 10, 1);
6103 gtk_spin_button_set_value(GTK_SPIN_BUTTON(spin), data->line_width);
6104 gtk_box_pack_start(GTK_BOX(hbox), spin, TRUE, FALSE, 2);
6105 gtk_widget_show(spin);
6106 g_object_set_data(G_OBJECT (window), "SpinLineWidth", spin);
6107
6108 label=gtk_label_new(_("Line type :"));
6109 gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, FALSE, 2);
6110 gtk_widget_show(label);
6111
6112 combo = add_line_types_combo(hbox);
6113 gtk_combo_box_set_active (GTK_COMBO_BOX (combo), 0);
6114 if(data->line_style == GDK_LINE_SOLID) gtk_combo_box_set_active (GTK_COMBO_BOX (combo), 0);
6115 else if(data->line_style == GDK_LINE_ON_OFF_DASH) gtk_combo_box_set_active (GTK_COMBO_BOX (combo), 1);
6116 else if(data->line_style == GDK_LINE_DOUBLE_DASH) gtk_combo_box_set_active (GTK_COMBO_BOX (combo), 2);
6117 gtk_widget_show(combo);
6118 g_object_set_data(G_OBJECT (window), "ComboLineType", combo);
6119
6120 label=gtk_label_new(_("Line color :"));
6121 gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, FALSE, 2);
6122 gtk_widget_show(label);
6123
6124 button = gtk_color_button_new_with_color (&data->line_color);
6125 gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, FALSE, 2);
6126 gtk_widget_show(button);
6127 g_object_set_data(G_OBJECT (window), "ColorButton", button);
6128
6129 frame = gtk_frame_new(_("Set point type"));
6130 gtk_box_pack_start(GTK_BOX(vbox_window), frame, TRUE, FALSE, 2);
6131 gtk_widget_show(frame);
6132
6133 hbox=gtk_hbox_new(FALSE, 0);
6134 gtk_container_add(GTK_CONTAINER(frame), hbox);
6135 gtk_widget_show(hbox);
6136
6137 label=gtk_label_new(_("Point size :"));
6138 gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, FALSE, 2);
6139 gtk_widget_show(label);
6140
6141 spin_point = gtk_spin_button_new_with_range(0, 30, 1);
6142 gtk_spin_button_set_value(GTK_SPIN_BUTTON(spin_point), data->point_size);
6143 gtk_box_pack_start(GTK_BOX(hbox), spin_point, TRUE, FALSE, 2);
6144 gtk_widget_show(spin_point);
6145 g_object_set_data(G_OBJECT (window), "SpinPointWidth", spin_point);
6146
6147 label=gtk_label_new(_("Point type :"));
6148 gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, FALSE, 2);
6149 gtk_widget_show(label);
6150
6151 combo_point = add_point_types_combo(hbox, data);
6152 gtk_widget_show(combo_point);
6153 g_object_set_data(G_OBJECT (window), "ComboPointType", combo_point);
6154
6155 label=gtk_label_new(_("Point color :"));
6156 gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, FALSE, 2);
6157 gtk_widget_show(label);
6158
6159 button_point = gtk_color_button_new_with_color (&data->point_color);
6160 gtk_box_pack_start(GTK_BOX(hbox), button_point, TRUE, FALSE, 2);
6161 gtk_widget_show(button_point);
6162 g_object_set_data(G_OBJECT (window), "ColorButton", button_point);
6163
6164
6165 frame = gtk_frame_new(NULL);
6166 gtk_box_pack_start(GTK_BOX(vbox_window), frame, TRUE, FALSE, 2);
6167 gtk_widget_show(frame);
6168
6169 hbox=gtk_hbox_new(FALSE, 0);
6170 gtk_container_add(GTK_CONTAINER(frame), hbox);
6171 gtk_widget_show(hbox);
6172
6173
6174 label=gtk_label_new(_("Scale X : "));
6175 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 2);
6176 gtk_widget_show(label);
6177
6178 entry_scale_x = gtk_entry_new();
6179 gtk_widget_set_size_request(entry_scale_x,50,-1);
6180 gtk_entry_set_text(GTK_ENTRY(entry_scale_x),"1.0");
6181 gtk_box_pack_start(GTK_BOX(hbox), entry_scale_x, FALSE, FALSE, 2);
6182 gtk_widget_show(entry_scale_x);
6183
6184 label=gtk_label_new(_("Scale Y : "));
6185 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 2);
6186 gtk_widget_show(label);
6187
6188 entry_scale_y = gtk_entry_new();
6189 gtk_widget_set_size_request(entry_scale_y,50,-1);
6190 gtk_entry_set_text(GTK_ENTRY(entry_scale_y),"1.0");
6191 gtk_box_pack_start(GTK_BOX(hbox), entry_scale_y, FALSE, FALSE, 2);
6192 gtk_widget_show(entry_scale_y);
6193
6194 label=gtk_label_new(_("Shift X : "));
6195 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 2);
6196 gtk_widget_show(label);
6197
6198 entry_shift_x = gtk_entry_new();
6199 gtk_widget_set_size_request(entry_shift_x,50,-1);
6200 gtk_entry_set_text(GTK_ENTRY(entry_shift_x),"0.0");
6201 gtk_box_pack_start(GTK_BOX(hbox), entry_shift_x, FALSE, FALSE, 2);
6202 gtk_widget_show(entry_shift_x);
6203
6204 label=gtk_label_new(_("Shift Y : "));
6205 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 2);
6206 gtk_widget_show(label);
6207
6208
6209 entry_shift_y = gtk_entry_new();
6210 gtk_widget_set_size_request(entry_shift_y,50,-1);
6211 gtk_entry_set_text(GTK_ENTRY(entry_shift_y),"0.0");
6212 gtk_box_pack_start(GTK_BOX(hbox), entry_shift_y, FALSE, FALSE, 2);
6213 gtk_widget_show(entry_shift_y);
6214
6215 frame = gtk_frame_new(NULL);
6216 gtk_box_pack_start(GTK_BOX(vbox_window), frame, TRUE, FALSE, 2);
6217 gtk_widget_show(frame);
6218
6219 hbox=gtk_hbox_new(FALSE, 0);
6220 gtk_container_add(GTK_CONTAINER(frame), hbox);
6221 gtk_widget_show(hbox);
6222
6223 buttonAutoRangesAll = gtk_button_new_with_label (_("Auto ranges all"));
6224 gtk_box_pack_start(GTK_BOX(hbox), buttonAutoRangesAll, TRUE, TRUE, 4);
6225 gtk_widget_show (buttonAutoRangesAll);
6226
6227
6228
6229 g_object_set_data(G_OBJECT (spin), "CurentData", NULL);
6230 g_signal_connect(G_OBJECT(spin), "value-changed", G_CALLBACK(spin_line_width_changed_value), xyplot);
6231 g_object_set_data(G_OBJECT (button), "CurentData", NULL);
6232 g_signal_connect(G_OBJECT(button), "color-set", G_CALLBACK(spin_line_color_changed_value), xyplot);
6233 g_signal_connect(G_OBJECT(combo), "changed", G_CALLBACK(combo_line_style_changed_value), xyplot);
6234 g_object_set_data(G_OBJECT (combo), "CurentData", NULL);
6235
6236 g_signal_connect(G_OBJECT(combo_point), "changed", G_CALLBACK(combo_point_style_changed_value), xyplot);
6237 g_object_set_data(G_OBJECT (combo_point), "CurentData", NULL);
6238
6239 g_object_set_data(G_OBJECT (spin_point), "CurentData", NULL);
6240 g_signal_connect(G_OBJECT(spin_point), "value-changed", G_CALLBACK(spin_point_size_changed_value), xyplot);
6241 g_object_set_data(G_OBJECT (button_point), "CurentData", NULL);
6242 g_signal_connect(G_OBJECT(button_point), "color-set", G_CALLBACK(spin_point_color_changed_value), xyplot);
6243
6244
6245 g_object_set_data(G_OBJECT (buttonAutoRangesAll), "CurentData", NULL);
6246 g_signal_connect(G_OBJECT(buttonAutoRangesAll), "clicked", G_CALLBACK(auto_range_activate), xyplot);
6247
6248 g_object_set_data(G_OBJECT (entry_scale_x), "CurentData", NULL);
6249 g_object_set_data(G_OBJECT (entry_scale_y), "CurentData", NULL);
6250 g_object_set_data(G_OBJECT (entry_shift_x), "CurentData", NULL);
6251 g_object_set_data(G_OBJECT (entry_shift_y), "CurentData", NULL);
6252 g_signal_connect (G_OBJECT (entry_scale_x), "activate", (GCallback)activate_entry_scale_x, xyplot);
6253 g_signal_connect (G_OBJECT (entry_scale_y), "activate", (GCallback)activate_entry_scale_y, xyplot);
6254 g_signal_connect (G_OBJECT (entry_shift_x), "activate", (GCallback)activate_entry_shift_x, xyplot);
6255 g_signal_connect (G_OBJECT (entry_shift_y), "activate", (GCallback)activate_entry_shift_y, xyplot);
6256
6257 parentWindow = get_parent_window(GTK_WIDGET(xyplot));
6258 if(parentWindow)
6259 {
6260 gtk_window_set_transient_for(GTK_WINDOW(window),GTK_WINDOW(parentWindow));
6261 }
6262 gtk_widget_show(window);
6263 /* list_utf8();*/
6264
6265
6266 }
6267 /*********************************************************************************************************************/
toggle_action(GtkAction * action)6268 static void toggle_action (GtkAction *action)
6269 {
6270 const gchar *name = gtk_action_get_name (action);
6271 gboolean enable = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));
6272 GtkWidget* xyplot = g_object_get_data(G_OBJECT (action), "XYPLOT");
6273 if(!xyplot) return;
6274 if(!strcmp(name,"HGridShowMajor"))
6275 xyplot_enable_grids (GABEDIT_XYPLOT(xyplot), GABEDIT_XYPLOT_HMAJOR_GRID, enable);
6276 else if(!strcmp(name,"HGridShowMinor"))
6277 xyplot_enable_grids (GABEDIT_XYPLOT(xyplot), GABEDIT_XYPLOT_HMINOR_GRID, enable);
6278 else if(!strcmp(name,"VGridShowMajor"))
6279 xyplot_enable_grids (GABEDIT_XYPLOT(xyplot), GABEDIT_XYPLOT_VMAJOR_GRID, enable);
6280 else if(!strcmp(name,"VGridShowMinor"))
6281 xyplot_enable_grids (GABEDIT_XYPLOT(xyplot), GABEDIT_XYPLOT_VMINOR_GRID, enable);
6282 else if(!strcmp(name,"LegendShowLeft"))
6283 xyplot_show_left_legends (GABEDIT_XYPLOT(xyplot), enable);
6284 else if(!strcmp(name,"LegendShowRight"))
6285 xyplot_show_right_legends (GABEDIT_XYPLOT(xyplot), enable);
6286 else if(!strcmp(name,"LegendShowTop"))
6287 xyplot_show_top_legends (GABEDIT_XYPLOT(xyplot), enable);
6288 else if(!strcmp(name,"LegendShowBottom"))
6289 xyplot_show_bottom_legends (GABEDIT_XYPLOT(xyplot), enable);
6290 else if(!strcmp(name,"LegendShowRectangle"))
6291 xyplot_show_rectangle_legends (GABEDIT_XYPLOT(xyplot), enable);
6292 else if(!strcmp(name,"DirectionReflectX"))
6293 xyplot_reflect_x (GABEDIT_XYPLOT(xyplot), enable);
6294 else if(!strcmp(name,"DirectionReflectY"))
6295 xyplot_reflect_y (GABEDIT_XYPLOT(xyplot), enable);
6296 }
6297 /*--------------------------------------------------------------------------------------------------------------------*/
6298 static GtkToggleActionEntry gtkActionToggleEntries[] =
6299 {
6300 { "HGridShowMajor", NULL, N_("show _H major"), NULL, "show H major", G_CALLBACK (toggle_action), TRUE },
6301 { "HGridShowMinor", NULL, N_("show _H minor"), NULL, "show H minor", G_CALLBACK (toggle_action), FALSE },
6302 { "VGridShowMajor", NULL, N_("show _V major"), NULL, "show V major", G_CALLBACK (toggle_action), TRUE },
6303 { "VGridShowMinor", NULL, N_("show _V minor"), NULL, "show V minor", G_CALLBACK (toggle_action), FALSE },
6304 { "LegendShowLeft", NULL, N_("show _left"), NULL, "show left", G_CALLBACK (toggle_action), TRUE },
6305 { "LegendShowRight", NULL, N_("show _right"), NULL, "show right", G_CALLBACK (toggle_action), TRUE },
6306 { "LegendShowTop", NULL, N_("show _top"), NULL, "show top", G_CALLBACK (toggle_action), TRUE },
6307 { "LegendShowBottom", NULL, N_("show _bottom"), NULL, "show bottom", G_CALLBACK (toggle_action), TRUE },
6308 { "LegendShowRectangle", NULL, N_("show _rectangle"), NULL, "show rectangle", G_CALLBACK (toggle_action), TRUE },
6309 { "DirectionReflectX", NULL, N_("_X reflect"), NULL, "X reflect", G_CALLBACK (toggle_action), FALSE },
6310 { "DirectionReflectY", NULL, N_("_Y reflect"), NULL, "Y reflect", G_CALLBACK (toggle_action), FALSE },
6311 };
6312 /*--------------------------------------------------------------------------------------------------------------------*/
init_toggle_entries(GtkWidget * xyplot)6313 static void init_toggle_entries (GtkWidget* xyplot)
6314 {
6315 xyplot_enable_grids (GABEDIT_XYPLOT(xyplot), GABEDIT_XYPLOT_HMAJOR_GRID, gtkActionToggleEntries[0].is_active);
6316 xyplot_enable_grids (GABEDIT_XYPLOT(xyplot), GABEDIT_XYPLOT_HMINOR_GRID, gtkActionToggleEntries[1].is_active);
6317 xyplot_enable_grids (GABEDIT_XYPLOT(xyplot), GABEDIT_XYPLOT_VMAJOR_GRID, gtkActionToggleEntries[2].is_active);
6318 xyplot_enable_grids (GABEDIT_XYPLOT(xyplot), GABEDIT_XYPLOT_VMINOR_GRID, gtkActionToggleEntries[3].is_active);
6319 xyplot_show_left_legends (GABEDIT_XYPLOT(xyplot), gtkActionToggleEntries[4].is_active);
6320 xyplot_show_right_legends (GABEDIT_XYPLOT(xyplot), gtkActionToggleEntries[5].is_active);
6321 xyplot_show_top_legends (GABEDIT_XYPLOT(xyplot), gtkActionToggleEntries[6].is_active);
6322 xyplot_show_bottom_legends (GABEDIT_XYPLOT(xyplot), gtkActionToggleEntries[7].is_active);
6323 xyplot_show_rectangle_legends (GABEDIT_XYPLOT(xyplot), gtkActionToggleEntries[8].is_active);
6324
6325 xyplot_reflect_x (GABEDIT_XYPLOT(xyplot), gtkActionToggleEntries[9].is_active);
6326 xyplot_reflect_y (GABEDIT_XYPLOT(xyplot), gtkActionToggleEntries[10].is_active);
6327 }
6328 static gint numberOfGtkActionToggleEntries = G_N_ELEMENTS (gtkActionToggleEntries);
6329 /*********************************************************************************************************************/
activate_action(GtkAction * action)6330 static void activate_action (GtkAction *action)
6331 {
6332 const gchar *name = gtk_action_get_name (action);
6333 GtkWidget* xyplot = g_object_get_data(G_OBJECT (action), "XYPLOT");
6334 if(!strcmp(name,"SetTicks")) { set_ticks_dialog(xyplot); }
6335 if(!strcmp(name,"SetMargins")) { set_margins_dialog(xyplot); }
6336 if(!strcmp(name,"SetRanges")) { set_ranges_dialog(xyplot); }
6337 if(!strcmp(name,"SetLabels")) { set_labels_dialog(xyplot); }
6338 if(!strcmp(name,"SetDigits")) { set_digits_dialog(xyplot); }
6339 if(!strcmp(name,"SetFontSize")) { set_font_size_dialog(xyplot); }
6340 if(!strcmp(name,"SetAll")) { set_all_dialog(xyplot); }
6341 if(!strcmp(name,"SetAutoRanges")) { gabedit_xyplot_set_autorange(GABEDIT_XYPLOT(xyplot), NULL); }
6342 if(!strcmp(name,"DataRead2Columns")) { read_data_2columns_dlg(xyplot,FALSE); }
6343 if(!strcmp(name,"DataRead2ColumnsPeaks")) { read_data_2columns_dlg(xyplot,TRUE); }
6344 if(!strcmp(name,"DataRead1Column")) { read_data_1column_dlg(xyplot,FALSE); }
6345 if(!strcmp(name,"DataRead1ColumnPeaks")) { read_data_1column_dlg(xyplot,TRUE); }
6346 if(!strcmp(name,"DataReadXY1YnColumns")) { read_data_xy1yncolumns_dlg(xyplot,FALSE); }
6347 if(!strcmp(name,"DataReadXY1YnColumnsPeaks")) { read_data_xy1yncolumns_dlg(xyplot,TRUE); }
6348 if(!strcmp(name,"DataReadJDX")) { read_data_jdx_dlg(xyplot); }
6349 if(!strcmp(name,"DataReadJMRUI")) { read_data_jMRUI_dlg(xyplot); }
6350 if(!strcmp(name,"DataSaveAll")) { save_all_data_2columns_dlg(xyplot); }
6351 if(!strcmp(name,"DataRemoveAll")) { remove_all_data_dlg(xyplot); }
6352 if(!strcmp(name,"DataChangeAll")) { set_all_data_dlg(xyplot); }
6353 if(!strcmp(name,"ObjectsInsertText")) { begin_insert_objects_text(xyplot); }
6354 if(!strcmp(name,"ObjectsInsertImage")) { begin_insert_objects_image(xyplot); }
6355 if(!strcmp(name,"ObjectsInsertImageClip")) { insert_objects_image_from_clipboard(xyplot);}
6356 if(!strcmp(name,"ThemesPublication")) { set_theme_publication(xyplot); }
6357 if(!strcmp(name,"ThemesGreenBlack")) { set_theme_green_black(xyplot); }
6358 if(!strcmp(name,"ThemesOther")) { set_theme_dialog(xyplot); }
6359 if(!strcmp(name,"ObjectsDeleteTexts")) { delete_objects_text(xyplot); }
6360 if(!strcmp(name,"ObjectsDeleteImage")) { delete_objects_image(xyplot); }
6361 if(!strcmp(name,"ObjectsInsertLine")) { begin_insert_objects_line(xyplot); }
6362 if(!strcmp(name,"ObjectsDeleteLines")) { delete_objects_line(xyplot); }
6363 if(!strcmp(name,"ScreenCaptureBMP")) { saveImageDlg(xyplot, "bmp");}
6364 if(!strcmp(name,"ScreenCaptureJPEG")) { saveImageDlg(xyplot, "jpeg");}
6365 if(!strcmp(name,"ScreenCapturePNG")) { saveImageDlg(xyplot, "png");}
6366 if(!strcmp(name,"ScreenCaptureTPNG")) { saveImageDlg(xyplot, "tpng");}
6367 if(!strcmp(name,"ScreenCaptureTIF")) { saveImageDlg(xyplot, "tif");}
6368 if(!strcmp(name,"ScreenCaptureClipBoard")) { copyImageToClipBoard(xyplot); }
6369 if(!strcmp(name,"ExportSVG")) { exportImageDlg(xyplot, "svg");}
6370 if(!strcmp(name,"ExportPDF")) { exportImageDlg(xyplot, "pdf");}
6371 if(!strcmp(name,"ExportPS")) { exportImageDlg(xyplot, "ps");}
6372 if(!strcmp(name,"ExportEPS")) { exportImageDlg(xyplot, "eps");}
6373 if(!strcmp(name,"Read")) { readAGabeditDlg(xyplot);}
6374 if(!strcmp(name,"Save")) { saveAsGabeditDlg(xyplot);}
6375 if(!strcmp(name,"Help")) { gabedit_xyplot_help();}
6376 if(!strcmp(name,"Close")) { destroy_xyplot_window(xyplot);}
6377 }
6378 /*--------------------------------------------------------------------*/
6379 static GtkActionEntry gtkActionEntries[] =
6380 {
6381 {"Set", NULL, N_("_Set")},
6382 {"SetTicks", NULL, N_("_Ticks"), NULL, "Ticks", G_CALLBACK (activate_action) },
6383 {"SetMargins", NULL, N_("_Margins"), NULL, "Margins", G_CALLBACK (activate_action) },
6384 {"SetRanges", NULL, N_("_Ranges"), NULL, "Ranges", G_CALLBACK (activate_action) },
6385 {"SetLabels", NULL, N_("_Labels"), NULL, "Labels", G_CALLBACK (activate_action) },
6386 {"SetDigits", NULL, N_("_Digits"), NULL, "Digits", G_CALLBACK (activate_action) },
6387 {"SetFontSize", NULL, N_("_Font size"), NULL, "Font size", G_CALLBACK (activate_action) },
6388 {"SetAll", NULL, N_("_All"), NULL, "All", G_CALLBACK (activate_action) },
6389 {"SetAutoRanges", NULL, N_("_Auto ranges"), NULL, "Auto ranges", G_CALLBACK (activate_action) },
6390 {"Render", NULL, N_("_Render")},
6391 {"RenderGrid", NULL, N_("_Grid")},
6392 {"RenderLegends", NULL, N_("_Legends")},
6393 {"RenderDirections", NULL, N_("_Directions")},
6394 {"Data", NULL, N_("_Data")},
6395 {"DataAdd", NULL, N_("_Add Data")},
6396 {"DataRead2Columns", NULL, N_("_Read data from an ASCII XY file(2 columns)"), NULL, "Read data from an ASCII XY file(2 columns)", G_CALLBACK (activate_action) },
6397 {"DataRead1Column", NULL, N_("_Read data from an ASCII Y file(1 column)"), NULL, "Read data from an ASCII Y file(1 column)", G_CALLBACK (activate_action) },
6398 {"DataReadXY1YnColumns", NULL, N_("_Read data from an ASCII X.Y1..Yn file(x, y1, y2,...,yn)"), NULL, "Read data from an ASCII XY file(2 columns)", G_CALLBACK (activate_action) },
6399 {"DataReadJDX", NULL, N_("_Read data from a JDX file"), NULL, "Read data from a JDX file", G_CALLBACK (activate_action) },
6400 {"DataReadJMRUI", NULL, N_("_Read data from a jMRUI text file"), NULL, "Read data from a jMRUI text file", G_CALLBACK (activate_action) },
6401 {"DataRead2ColumnsPeaks", NULL, N_("_Read data from an ASCII XY file(2 columns) and draw peaks"), NULL, "Read data from an ASCII XY file(2 columns) and draw peaks", G_CALLBACK (activate_action) },
6402 {"DataRead1ColumnPeaks", NULL, N_("_Read data from an ASCII Y file(1 column) and draw peaks"), NULL, "Read data from an ASCII Y file(1 column) and draw peaks", G_CALLBACK (activate_action) },
6403 {"DataReadXY1YnColumnsPeaks", NULL, N_("_Read data from an ASCII X.Y1..Yn file(x, y1, y2,...,yn) and draw peaks"), NULL, "Read data from an ASCII XY file(2 columns) and draw peaks", G_CALLBACK (activate_action) },
6404 {"DataSaveAll", NULL, N_("_Save all data in an ascii XY file(2columns)"), NULL, "Save all data in an ascii file(2columns)", G_CALLBACK (activate_action) },
6405 {"DataRemoveAll", NULL, N_("_Remove all data"), NULL, "Remove all data", G_CALLBACK (activate_action) },
6406 {"DataChangeAll", NULL, N_("_Change all"), NULL, "change all", G_CALLBACK (activate_action) },
6407 {"Objects", NULL, N_("_Objects")},
6408 {"ObjectsInsertText", NULL, N_("Insert a _text(Click in window)"), NULL, "Insert a text", G_CALLBACK (activate_action) },
6409 {"ObjectsDeleteTexts", NULL, N_("Delete all _texts"), NULL, "Delete all texts", G_CALLBACK (activate_action) },
6410 {"ObjectsInsertLine", NULL, N_("Insert a _line(Click in window and move)"), NULL, "Insert a line", G_CALLBACK (activate_action) },
6411 {"ObjectsDeleteLines", NULL, N_("Delete all _lines"), NULL, "Delete all lines", G_CALLBACK (activate_action) },
6412 {"ObjectsInsertImage", NULL, N_("Insert an _image from a png file(Click in window)"), NULL, "Insert an image", G_CALLBACK (activate_action) },
6413 {"ObjectsInsertImageClip", NULL, N_("Insert an _image from clipboard"), NULL, "Insert an image", G_CALLBACK (activate_action) },
6414 {"ObjectsDeleteImage", NULL, N_("Delete all _images"), NULL, "Delete all images", G_CALLBACK (activate_action) },
6415 {"Themes", NULL, N_("_Themes")},
6416 {"ThemesPublication", NULL, N_("_Publication"), NULL, "Publication", G_CALLBACK (activate_action) },
6417 {"ThemesGreenBlack", NULL, N_("_Green&black"), NULL, "Green&black", G_CALLBACK (activate_action) },
6418 {"ThemesOther", NULL, N_("_Other"), NULL, "Other", G_CALLBACK (activate_action) },
6419 {"ScreenCapture", NULL, N_("_Screen Capture")},
6420 {"ScreenCaptureBMP", NULL, N_("_BMP format"), NULL, "BMP format", G_CALLBACK (activate_action) },
6421 {"ScreenCaptureJPEG", NULL, N_("_JPEG format"), NULL, "JPEG format", G_CALLBACK (activate_action) },
6422 {"ScreenCapturePNG", NULL, N_("_PNG format"), NULL, "PNG format", G_CALLBACK (activate_action) },
6423 {"ScreenCaptureTPNG", NULL, N_("_Transparent PNG format"), NULL, "Transparent PNG format", G_CALLBACK (activate_action) },
6424 {"ScreenCaptureTIF", NULL, N_("_TIF format"), NULL, "TIF format", G_CALLBACK (activate_action) },
6425 {"ScreenCaptureClipBoard", NULL, N_("_Copy to clipboard"), NULL, "Copy to clipboard", G_CALLBACK (activate_action) },
6426 {"Export", NULL, N_("_Export")},
6427 {"ExportSVG", NULL, N_("Export _SVG format"), NULL, "SVG format", G_CALLBACK (activate_action) },
6428 {"ExportPDF", NULL, N_("Export p_df format"), NULL, "PDF format", G_CALLBACK (activate_action) },
6429 {"ExportPS", NULL, N_("Export _postscript format"), NULL, "PS format", G_CALLBACK (activate_action) },
6430 {"ExportEPS", NULL, N_("Export _Encapsuled postscript format"), NULL, "EPS format", G_CALLBACK (activate_action) },
6431 {"Read", GTK_STOCK_OPEN, N_("_Read"), NULL, "Read", G_CALLBACK (activate_action) },
6432 {"Save", GTK_STOCK_SAVE, N_("_Save"), NULL, "Save", G_CALLBACK (activate_action) },
6433 {"Help", GTK_STOCK_HELP, N_("_Help"), NULL, "Help", G_CALLBACK (activate_action) },
6434 {"Close", GTK_STOCK_CLOSE, N_("_Close"), NULL, "Close", G_CALLBACK (activate_action) },
6435 };
6436
6437
6438 static gint numberOfGtkActionEntries = G_N_ELEMENTS (gtkActionEntries);
6439 /********************************************************************************/
add_data_to_actions(GtkUIManager * manager,GtkWidget * xyplot)6440 static void add_data_to_actions(GtkUIManager *manager, GtkWidget *xyplot)
6441 {
6442 GtkAction* action = NULL;
6443 action = gtk_ui_manager_get_action (manager, "/MenuXYPlot/Set/SetTicks");
6444 if(action) g_object_set_data(G_OBJECT (action), "XYPLOT", xyplot);
6445
6446 action = gtk_ui_manager_get_action (manager, "/MenuXYPlot/Set/SetMargins");
6447 if(action) g_object_set_data(G_OBJECT (action), "XYPLOT", xyplot);
6448
6449 action = gtk_ui_manager_get_action (manager, "/MenuXYPlot/Set/SetRanges");
6450 if(action) g_object_set_data(G_OBJECT (action), "XYPLOT", xyplot);
6451
6452 action = gtk_ui_manager_get_action (manager, "/MenuXYPlot/Set/SetLabels");
6453 if(action) g_object_set_data(G_OBJECT (action), "XYPLOT", xyplot);
6454
6455 action = gtk_ui_manager_get_action (manager, "/MenuXYPlot/Set/SetDigits");
6456 if(action) g_object_set_data(G_OBJECT (action), "XYPLOT", xyplot);
6457
6458 action = gtk_ui_manager_get_action (manager, "/MenuXYPlot/Set/SetFontSize");
6459 if(action) g_object_set_data(G_OBJECT (action), "XYPLOT", xyplot);
6460
6461 action = gtk_ui_manager_get_action (manager, "/MenuXYPlot/Set/SetAll");
6462 if(action) g_object_set_data(G_OBJECT (action), "XYPLOT", xyplot);
6463
6464 action = gtk_ui_manager_get_action (manager, "/MenuXYPlot/Set/SetAutoRanges");
6465 if(action) g_object_set_data(G_OBJECT (action), "XYPLOT", xyplot);
6466
6467 action = gtk_ui_manager_get_action (manager, "/MenuXYPlot/Render/RenderGrid/HGridShowMajor");
6468 if(action) g_object_set_data(G_OBJECT (action), "XYPLOT", xyplot);
6469 action = gtk_ui_manager_get_action (manager, "/MenuXYPlot/Render/RenderGrid/HGridShowMinor");
6470 if(action) g_object_set_data(G_OBJECT (action), "XYPLOT", xyplot);
6471 action = gtk_ui_manager_get_action (manager, "/MenuXYPlot/Render/RenderGrid/VGridShowMajor");
6472 if(action) g_object_set_data(G_OBJECT (action), "XYPLOT", xyplot);
6473 action = gtk_ui_manager_get_action (manager, "/MenuXYPlot/Render/RenderGrid/VGridShowMinor");
6474 if(action) g_object_set_data(G_OBJECT (action), "XYPLOT", xyplot);
6475
6476 action = gtk_ui_manager_get_action (manager, "/MenuXYPlot/Render/RenderLegends/LegendShowLeft");
6477 if(action) g_object_set_data(G_OBJECT (action), "XYPLOT", xyplot);
6478 action = gtk_ui_manager_get_action (manager, "/MenuXYPlot/Render/RenderLegends/LegendShowRight");
6479 if(action) g_object_set_data(G_OBJECT (action), "XYPLOT", xyplot);
6480 action = gtk_ui_manager_get_action (manager, "/MenuXYPlot/Render/RenderLegends/LegendShowTop");
6481 if(action) g_object_set_data(G_OBJECT (action), "XYPLOT", xyplot);
6482 action = gtk_ui_manager_get_action (manager, "/MenuXYPlot/Render/RenderLegends/LegendShowBottom");
6483 if(action) g_object_set_data(G_OBJECT (action), "XYPLOT", xyplot);
6484 action = gtk_ui_manager_get_action (manager, "/MenuXYPlot/Render/RenderLegends/LegendShowRectangle");
6485 if(action) g_object_set_data(G_OBJECT (action), "XYPLOT", xyplot);
6486 action = gtk_ui_manager_get_action (manager, "/MenuXYPlot/Render/RenderDirections/DirectionReflectX");
6487 if(action) g_object_set_data(G_OBJECT (action), "XYPLOT", xyplot);
6488 action = gtk_ui_manager_get_action (manager, "/MenuXYPlot/Render/RenderDirections/DirectionReflectY");
6489 if(action) g_object_set_data(G_OBJECT (action), "XYPLOT", xyplot);
6490
6491 action = gtk_ui_manager_get_action (manager, "/MenuXYPlot/Data/DataAdd/DataRead2Columns");
6492 if(action) g_object_set_data(G_OBJECT (action), "XYPLOT", xyplot);
6493
6494 action = gtk_ui_manager_get_action (manager, "/MenuXYPlot/Data/DataAdd/DataRead2ColumnsPeaks");
6495 if(action) g_object_set_data(G_OBJECT (action), "XYPLOT", xyplot);
6496
6497 action = gtk_ui_manager_get_action (manager, "/MenuXYPlot/Data/DataAdd/DataRead1Column");
6498 if(action) g_object_set_data(G_OBJECT (action), "XYPLOT", xyplot);
6499
6500 action = gtk_ui_manager_get_action (manager, "/MenuXYPlot/Data/DataAdd/DataRead1ColumnPeaks");
6501 if(action) g_object_set_data(G_OBJECT (action), "XYPLOT", xyplot);
6502
6503 action = gtk_ui_manager_get_action (manager, "/MenuXYPlot/Data/DataAdd/DataReadXY1YnColumns");
6504 if(action) g_object_set_data(G_OBJECT (action), "XYPLOT", xyplot);
6505
6506 action = gtk_ui_manager_get_action (manager, "/MenuXYPlot/Data/DataAdd/DataReadXY1YnColumnsPeaks");
6507 if(action) g_object_set_data(G_OBJECT (action), "XYPLOT", xyplot);
6508
6509 action = gtk_ui_manager_get_action (manager, "/MenuXYPlot/Data/DataAdd/DataReadJDX");
6510 if(action) g_object_set_data(G_OBJECT (action), "XYPLOT", xyplot);
6511
6512 action = gtk_ui_manager_get_action (manager, "/MenuXYPlot/Data/DataAdd/DataReadJMRUI");
6513 if(action) g_object_set_data(G_OBJECT (action), "XYPLOT", xyplot);
6514
6515 action = gtk_ui_manager_get_action (manager, "/MenuXYPlot/Data/DataSaveAll");
6516 if(action) g_object_set_data(G_OBJECT (action), "XYPLOT", xyplot);
6517
6518 action = gtk_ui_manager_get_action (manager, "/MenuXYPlot/Data/DataRemoveAll");
6519 if(action) g_object_set_data(G_OBJECT (action), "XYPLOT", xyplot);
6520
6521 action = gtk_ui_manager_get_action (manager, "/MenuXYPlot/Data/DataChangeAll");
6522 if(action) g_object_set_data(G_OBJECT (action), "XYPLOT", xyplot);
6523
6524 action = gtk_ui_manager_get_action (manager, "/MenuXYPlot/Objects/ObjectsDeleteTexts");
6525 if(action) g_object_set_data(G_OBJECT (action), "XYPLOT", xyplot);
6526
6527 action = gtk_ui_manager_get_action (manager, "/MenuXYPlot/Objects/ObjectsInsertText");
6528 if(action) g_object_set_data(G_OBJECT (action), "XYPLOT", xyplot);
6529
6530 action = gtk_ui_manager_get_action (manager, "/MenuXYPlot/Objects/ObjectsInsertImage");
6531 if(action) g_object_set_data(G_OBJECT (action), "XYPLOT", xyplot);
6532
6533 action = gtk_ui_manager_get_action (manager, "/MenuXYPlot/Objects/ObjectsInsertImageClip");
6534 if(action) g_object_set_data(G_OBJECT (action), "XYPLOT", xyplot);
6535
6536 action = gtk_ui_manager_get_action (manager, "/MenuXYPlot/Objects/ObjectsDeleteImage");
6537 if(action) g_object_set_data(G_OBJECT (action), "XYPLOT", xyplot);
6538
6539 action = gtk_ui_manager_get_action (manager, "/MenuXYPlot/Themes/ThemesPublication");
6540 if(action) g_object_set_data(G_OBJECT (action), "XYPLOT", xyplot);
6541 action = gtk_ui_manager_get_action (manager, "/MenuXYPlot/Themes/ThemesGreenBlack");
6542 if(action) g_object_set_data(G_OBJECT (action), "XYPLOT", xyplot);
6543 action = gtk_ui_manager_get_action (manager, "/MenuXYPlot/Themes/ThemesOther");
6544 if(action) g_object_set_data(G_OBJECT (action), "XYPLOT", xyplot);
6545
6546 action = gtk_ui_manager_get_action (manager, "/MenuXYPlot/Objects/ObjectsDeleteLines");
6547 if(action) g_object_set_data(G_OBJECT (action), "XYPLOT", xyplot);
6548
6549 action = gtk_ui_manager_get_action (manager, "/MenuXYPlot/Objects/ObjectsInsertLine");
6550 if(action) g_object_set_data(G_OBJECT (action), "XYPLOT", xyplot);
6551
6552 action = gtk_ui_manager_get_action (manager, "/MenuXYPlot/ScreenCapture/ScreenCaptureBMP");
6553 if(action) g_object_set_data(G_OBJECT (action), "XYPLOT", xyplot);
6554 action = gtk_ui_manager_get_action (manager, "/MenuXYPlot/ScreenCapture/ScreenCaptureJPEG");
6555 if(action) g_object_set_data(G_OBJECT (action), "XYPLOT", xyplot);
6556 action = gtk_ui_manager_get_action (manager, "/MenuXYPlot/ScreenCapture/ScreenCapturePNG");
6557 if(action) g_object_set_data(G_OBJECT (action), "XYPLOT", xyplot);
6558 action = gtk_ui_manager_get_action (manager, "/MenuXYPlot/ScreenCapture/ScreenCaptureTPNG");
6559 if(action) g_object_set_data(G_OBJECT (action), "XYPLOT", xyplot);
6560 action = gtk_ui_manager_get_action (manager, "/MenuXYPlot/ScreenCapture/ScreenCaptureTIF");
6561 if(action) g_object_set_data(G_OBJECT (action), "XYPLOT", xyplot);
6562 action = gtk_ui_manager_get_action (manager, "/MenuXYPlot/ScreenCapture/ScreenCaptureClipBoard");
6563 if(action) g_object_set_data(G_OBJECT (action), "XYPLOT", xyplot);
6564
6565 action = gtk_ui_manager_get_action (manager, "/MenuXYPlot/Export/ExportSVG");
6566 if(action) g_object_set_data(G_OBJECT (action), "XYPLOT", xyplot);
6567
6568 action = gtk_ui_manager_get_action (manager, "/MenuXYPlot/Export/ExportPDF");
6569 if(action) g_object_set_data(G_OBJECT (action), "XYPLOT", xyplot);
6570
6571
6572 action = gtk_ui_manager_get_action (manager, "/MenuXYPlot/Export/ExportPS");
6573 if(action) g_object_set_data(G_OBJECT (action), "XYPLOT", xyplot);
6574
6575 action = gtk_ui_manager_get_action (manager, "/MenuXYPlot/Export/ExportEPS");
6576 if(action) g_object_set_data(G_OBJECT (action), "XYPLOT", xyplot);
6577
6578 action = gtk_ui_manager_get_action (manager, "/MenuXYPlot/Read");
6579 if(action) g_object_set_data(G_OBJECT (action), "XYPLOT", xyplot);
6580
6581 action = gtk_ui_manager_get_action (manager, "/MenuXYPlot/Save");
6582 if(action) g_object_set_data(G_OBJECT (action), "XYPLOT", xyplot);
6583
6584 action = gtk_ui_manager_get_action (manager, "/MenuXYPlot/Help");
6585 if(action) g_object_set_data(G_OBJECT (action), "XYPLOT", xyplot);
6586
6587 action = gtk_ui_manager_get_action (manager, "/MenuXYPlot/Close");
6588 if(action) g_object_set_data(G_OBJECT (action), "XYPLOT", xyplot);
6589
6590 }
6591 /********************************************************************************/
6592 static const gchar *uiMenuInfo =
6593 " <popup name=\"MenuXYPlot\">\n"
6594 " <separator name=\"sepMenuPopSet\" />\n"
6595 " <menu name=\"Set\" action=\"Set\">\n"
6596 " <menuitem name=\"SetTicks\" action=\"SetTicks\" />\n"
6597 " <menuitem name=\"SetMargins\" action=\"SetMargins\" />\n"
6598 " <menuitem name=\"SetRanges\" action=\"SetRanges\" />\n"
6599 " <menuitem name=\"SetLabels\" action=\"SetLabels\" />\n"
6600 " <menuitem name=\"SetDigits\" action=\"SetDigits\" />\n"
6601 " <menuitem name=\"SetFontSize\" action=\"SetFontSize\" />\n"
6602 " <menuitem name=\"SetAll\" action=\"SetAll\" />\n"
6603 " <separator name=\"sepSetAutoRanges\" />\n"
6604 " <menuitem name=\"SetAutoRanges\" action=\"SetAutoRanges\" />\n"
6605 " </menu>\n"
6606 " <separator name=\"sepRender\" />\n"
6607 " <menu name=\"Render\" action=\"Render\">\n"
6608 " <menu name=\"RenderGrid\" action=\"RenderGrid\">\n"
6609 " <menuitem name=\"HGridShowMajor\" action=\"HGridShowMajor\" />\n"
6610 " <menuitem name=\"HGridShowMinor\" action=\"HGridShowMinor\" />\n"
6611 " <menuitem name=\"VGridShowMajor\" action=\"VGridShowMajor\" />\n"
6612 " <menuitem name=\"VGridShowMinor\" action=\"VGridShowMinor\" />\n"
6613 " </menu>\n"
6614 " <menu name=\"RenderLegends\" action=\"RenderLegends\">\n"
6615 " <menuitem name=\"LegendShowLeft\" action=\"LegendShowLeft\" />\n"
6616 " <menuitem name=\"LegendShowRight\" action=\"LegendShowRight\" />\n"
6617 " <menuitem name=\"LegendShowTop\" action=\"LegendShowTop\" />\n"
6618 " <menuitem name=\"LegendShowBottom\" action=\"LegendShowBottom\" />\n"
6619 " <menuitem name=\"LegendShowRectangle\" action=\"LegendShowRectangle\" />\n"
6620 " </menu>\n"
6621 " <menu name=\"RenderDirections\" action=\"RenderDirections\">\n"
6622 " <menuitem name=\"DirectionReflectX\" action=\"DirectionReflectX\" />\n"
6623 " <menuitem name=\"DirectionReflectY\" action=\"DirectionReflectY\" />\n"
6624 " </menu>\n"
6625 " </menu>\n"
6626 " <separator name=\"sepData\" />\n"
6627 " <menu name=\"Data\" action=\"Data\">\n"
6628 " <menu name=\"DataAdd\" action=\"DataAdd\">\n"
6629 " <menuitem name=\"DataRead2Columns\" action=\"DataRead2Columns\" />\n"
6630 " <menuitem name=\"DataReadXY1YnColumns\" action=\"DataReadXY1YnColumns\" />\n"
6631 " <menuitem name=\"DataRead1Column\" action=\"DataRead1Column\" />\n"
6632 " <menuitem name=\"DataReadJDX\" action=\"DataReadJDX\" />\n"
6633 " <menuitem name=\"DataReadJMRUI\" action=\"DataReadJMRUI\" />\n"
6634 " <separator name=\"sepPeaks\" />\n"
6635 " <menuitem name=\"DataRead2ColumnsPeaks\" action=\"DataRead2ColumnsPeaks\" />\n"
6636 " <menuitem name=\"DataRead1ColumnPeaks\" action=\"DataRead1ColumnPeaks\" />\n"
6637 " <menuitem name=\"DataReadXY1YnColumnsPeaks\" action=\"DataReadXY1YnColumnsPeaks\" />\n"
6638 " </menu>\n"
6639 " <separator name=\"sepDataSaveAll\" />\n"
6640 " <menuitem name=\"DataSaveAll\" action=\"DataSaveAll\" />\n"
6641 " <separator name=\"sepDataRemoveAll\" />\n"
6642 " <menuitem name=\"DataRemoveAll\" action=\"DataRemoveAll\" />\n"
6643 " <separator name=\"sepDataChangeAll\" />\n"
6644 " <menuitem name=\"DataChangeAll\" action=\"DataChangeAll\" />\n"
6645 " </menu>\n"
6646 " <separator name=\"sepObjects\" />\n"
6647 " <menu name=\"Objects\" action=\"Objects\">\n"
6648 " <menuitem name=\"ObjectsInsertText\" action=\"ObjectsInsertText\" />\n"
6649 " <menuitem name=\"ObjectsDeleteTexts\" action=\"ObjectsDeleteTexts\" />\n"
6650 " <menuitem name=\"ObjectsInsertLine\" action=\"ObjectsInsertLine\" />\n"
6651 " <menuitem name=\"ObjectsDeleteLines\" action=\"ObjectsDeleteLines\" />\n"
6652 " <menuitem name=\"ObjectsInsertImage\" action=\"ObjectsInsertImage\" />\n"
6653 " <menuitem name=\"ObjectsInsertImageClip\" action=\"ObjectsInsertImageClip\" />\n"
6654 " <menuitem name=\"ObjectsDeleteImage\" action=\"ObjectsDeleteImage\" />\n"
6655 " </menu>\n"
6656 " <separator name=\"sepThemes\" />\n"
6657 " <menu name=\"Themes\" action=\"Themes\">\n"
6658 " <menuitem name=\"ThemesPublication\" action=\"ThemesPublication\" />\n"
6659 " <menuitem name=\"ThemesGreenBlack\" action=\"ThemesGreenBlack\" />\n"
6660 " <menuitem name=\"ThemesOther\" action=\"ThemesOther\" />\n"
6661 " </menu>\n"
6662 " <separator name=\"sepScreenCapture\" />\n"
6663 " <separator name=\"sepScreenCapture\" />\n"
6664 " <menu name=\"ScreenCapture\" action=\"ScreenCapture\">\n"
6665 " <menuitem name=\"ScreenCaptureBMP\" action=\"ScreenCaptureBMP\" />\n"
6666 " <menuitem name=\"ScreenCaptureJPEG\" action=\"ScreenCaptureJPEG\" />\n"
6667 " <menuitem name=\"ScreenCapturePNG\" action=\"ScreenCapturePNG\" />\n"
6668 " <menuitem name=\"ScreenCaptureTPNG\" action=\"ScreenCaptureTPNG\" />\n"
6669 " <menuitem name=\"ScreenCaptureTIF\" action=\"ScreenCaptureTIF\" />\n"
6670 " <menuitem name=\"ScreenCaptureClipBoard\" action=\"ScreenCaptureClipBoard\" />\n"
6671 " </menu>\n"
6672 " <separator name=\"sepExport\" />\n"
6673 " <menu name=\"Export\" action=\"Export\">\n"
6674 " <menuitem name=\"ExportSVG\" action=\"ExportSVG\" />\n"
6675 " <menuitem name=\"ExportPDF\" action=\"ExportPDF\" />\n"
6676 " <menuitem name=\"ExportPS\" action=\"ExportPS\" />\n"
6677 " <menuitem name=\"ExportEPS\" action=\"ExportEPS\" />\n"
6678 " </menu>\n"
6679 " <separator name=\"sepRead\" />\n"
6680 " <menuitem name=\"Read\" action=\"Read\" />\n"
6681 " <separator name=\"sepSave\" />\n"
6682 " <menuitem name=\"Save\" action=\"Save\" />\n"
6683 " <separator name=\"sepHelp\" />\n"
6684 " <menuitem name=\"Help\" action=\"Help\" />\n"
6685 " <separator name=\"sepClose\" />\n"
6686 " <menuitem name=\"Close\" action=\"Close\" />\n"
6687 " </popup>\n"
6688 " <toolbar action=\"ToolbarXYPlot\">\n"
6689 " <toolitem name=\"SetTicks\" action=\"SetTicks\" />\n"
6690 " <toolitem name=\"SetMargins\" action=\"SetMargins\" />\n"
6691 " <toolitem name=\"SetRanges\" action=\"SetRanges\" />\n"
6692 " <toolitem name=\"ScreenCaptureBMP\" action=\"ScreenCaptureBMP\" />\n"
6693 " <toolitem name=\"ScreenCaptureJPEG\" action=\"ScreenCaptureJPEG\" />\n"
6694 " <toolitem name=\"ScreenCapturePNG\" action=\"ScreenCapturePNG\" />\n"
6695 " <toolitem name=\"ScreenCaptureTPNG\" action=\"ScreenCaptureTPNG\" />\n"
6696 " <toolitem name=\"ScreenCaptureTIF\" action=\"ScreenCaptureTIF\" />\n"
6697 " <toolitem name=\"ScreenCaptureClipBoard\" action=\"ScreenCaptureClipBoard\" />\n"
6698 " </toolbar>\n"
6699 ;
6700 /*****************************************************************************************/
add_widget(GtkUIManager * merge,GtkWidget * widget,GtkContainer * container)6701 static void add_widget (GtkUIManager *merge, GtkWidget *widget, GtkContainer *container)
6702 {
6703 GtkWidget *handlebox;
6704
6705 if (!GTK_IS_TOOLBAR (widget)) return;
6706
6707 handlebox =gtk_handle_box_new ();
6708 g_object_ref (handlebox);
6709 gtk_handle_box_set_handle_position (GTK_HANDLE_BOX(handlebox),GTK_POS_TOP);
6710 /* GTK_SHADOW_NONE, GTK_SHADOW_IN, GTK_SHADOW_OUT, GTK_SHADOW_ETCHED_IN, GTK_SHADOW_ETCHED_OUT */
6711 gtk_handle_box_set_shadow_type(GTK_HANDLE_BOX(handlebox),GTK_SHADOW_OUT);
6712 gtk_box_pack_start (GTK_BOX (container), handlebox, FALSE, FALSE, 0);
6713
6714 if (GTK_IS_TOOLBAR (widget))
6715 {
6716 GtkToolbar *toolbar;
6717 toolbar = GTK_TOOLBAR (widget);
6718 gtk_toolbar_set_show_arrow (toolbar, TRUE);
6719 gtk_toolbar_set_style(toolbar, GTK_TOOLBAR_ICONS);
6720 gtk_toolbar_set_orientation(toolbar, GTK_ORIENTATION_VERTICAL);
6721 }
6722 gtk_widget_show (widget);
6723 gtk_container_add (GTK_CONTAINER (handlebox), widget);
6724 gtk_widget_show (handlebox);
6725 }
6726 /*************************************************************************************************/
add_toolbar_and_popup_menu(GtkWidget * parent,GtkWidget * box)6727 static void add_toolbar_and_popup_menu(GtkWidget* parent, GtkWidget* box)
6728 {
6729 GtkActionGroup *actionGroup = NULL;
6730 GtkUIManager *merge = NULL;
6731 GError *error = NULL;
6732
6733 merge = gtk_ui_manager_new ();
6734 g_signal_connect_swapped (parent, "destroy", G_CALLBACK (g_object_unref), merge);
6735
6736 actionGroup = gtk_action_group_new ("GabeditXYPlotActions");
6737 gtk_action_group_set_translation_domain(actionGroup,GETTEXT_PACKAGE);
6738 gtk_action_group_add_actions (actionGroup, gtkActionEntries, numberOfGtkActionEntries, NULL);
6739 gtk_action_group_add_toggle_actions (actionGroup, gtkActionToggleEntries, numberOfGtkActionToggleEntries, NULL);
6740 gtk_ui_manager_insert_action_group (merge, actionGroup, 0);
6741
6742 if(box) g_signal_connect (merge, "add_widget", G_CALLBACK (add_widget), box);
6743 if (!gtk_ui_manager_add_ui_from_string (merge, uiMenuInfo, -1, &error))
6744 {
6745 g_message (_("building menus of xyplot failed: %s"), error->message);
6746 g_error_free (error);
6747 }
6748 g_object_set_data(G_OBJECT (parent), "Manager", merge);
6749 add_data_to_actions(merge,parent);
6750 init_toggle_entries (parent);
6751 }
6752 /****************************************************************************************/
gabedit_xyplot_get_type()6753 GType gabedit_xyplot_get_type ()
6754 {
6755
6756 static GType xyplot_type = 0;
6757 if (!xyplot_type)
6758 {
6759 static const GTypeInfo xyplot_info =
6760 {
6761 sizeof (GabeditXYPlotClass),
6762 NULL, /* base_init */
6763 NULL, /* base_finalize */
6764 (GClassInitFunc) gabedit_xyplot_class_init,
6765 NULL, /* class_finalize */
6766 NULL, /* class_data */
6767 sizeof (GabeditXYPlot),
6768 0, /* n_preallocs */
6769 (GInstanceInitFunc) gabedit_xyplot_init,
6770 };
6771 xyplot_type = g_type_register_static (GTK_TYPE_WIDGET, "GabeditXYPlot", &xyplot_info, 0);
6772 }
6773 return xyplot_type;
6774 }
6775 /****************************************************************************************/
gabedit_xyplot_class_init(GabeditXYPlotClass * class)6776 static void gabedit_xyplot_class_init (GabeditXYPlotClass *class)
6777 {
6778 GtkObjectClass *object_class;
6779 GtkWidgetClass *widget_class;
6780
6781 object_class = (GtkObjectClass*) class;
6782 widget_class = (GtkWidgetClass*) class;
6783
6784 parent_class = g_type_class_peek_parent (class);
6785
6786 object_class->destroy = gabedit_xyplot_destroy;
6787
6788 widget_class->realize = gabedit_xyplot_realize;
6789 widget_class->expose_event = gabedit_xyplot_expose;
6790 widget_class->size_request = gabedit_xyplot_size_request;
6791 widget_class->size_allocate = gabedit_xyplot_size_allocate;
6792 widget_class->button_press_event = gabedit_xyplot_button_press;
6793 widget_class->button_release_event = gabedit_xyplot_button_release;
6794 widget_class->motion_notify_event = gabedit_xyplot_motion_notify;
6795 widget_class->scroll_event = gabedit_xyplot_scroll;
6796 widget_class->style_set = gabedit_xyplot_style_set;
6797 widget_class->key_press_event = gabedit_xyplot_key_press;
6798 widget_class->key_release_event = gabedit_xyplot_key_release;
6799 widget_class->enter_notify_event = gabedit_xyplot_grab;
6800 widget_class->leave_notify_event = gabedit_xyplot_grab;
6801 }
6802 /****************************************************************************************/
gabedit_xyplot_init(GabeditXYPlot * xyplot)6803 static void gabedit_xyplot_init (GabeditXYPlot *xyplot)
6804 {
6805 g_return_if_fail (xyplot != NULL);
6806 g_return_if_fail (GABEDIT_IS_XYPLOT (xyplot));
6807
6808 xyplot->xmin=-1.0;
6809 xyplot->xmax=1.0;
6810 xyplot->ymin=-1.0;
6811 xyplot->ymax=1.0;
6812
6813 xyplot->x_legends_digits=8;
6814 xyplot->y_legends_digits=8;
6815
6816 xyplot->hmajor_ticks=11;
6817 xyplot->hminor_ticks=3;
6818 xyplot->vmajor_ticks=11;
6819 xyplot->vminor_ticks=3;
6820 xyplot->length_ticks=3;
6821
6822 xyplot->left_margins =0;
6823 xyplot->top_margins =0;
6824 xyplot->right_margins =0;
6825 xyplot->bottom_margins =0;
6826
6827 xyplot->hmajor_grid=TRUE;
6828 xyplot->hminor_grid=TRUE;
6829 xyplot->vmajor_grid=TRUE;
6830 xyplot->vminor_grid=TRUE;
6831
6832 xyplot->show_left_legends = TRUE;
6833 xyplot->show_right_legends = FALSE;
6834 xyplot->show_top_legends = FALSE;
6835 xyplot->show_bottom_legends = TRUE;
6836 xyplot->show_rectangle_legends = TRUE;
6837
6838 xyplot->reflect_x = FALSE;
6839 xyplot->reflect_y = FALSE;
6840
6841 xyplot->data_list=NULL;
6842
6843 xyplot->mouse_zoom_enabled=TRUE;
6844 xyplot->mouse_zoom_button = 2;
6845 xyplot->mouse_displace_enabled=FALSE;
6846 xyplot->wheel_zoom_enabled=FALSE;
6847 xyplot->mouse_autorange_enabled=FALSE;
6848 xyplot->mouse_autorange_button = 1;
6849 xyplot->mouse_distance_enabled=TRUE;
6850 xyplot->mouse_distance_button = 1;
6851
6852 xyplot->h_label_str = NULL;
6853 xyplot->v_label_str = NULL;
6854 xyplot->h_label = NULL;
6855 xyplot->v_label = NULL;
6856 xyplot->h_label_width = 0;
6857 xyplot->h_label_height = 0;
6858 xyplot->v_label_width = 0;
6859 xyplot->v_label_height = 0;
6860 xyplot->font_size = 12;
6861 xyplot->cairo_widget = NULL;
6862 xyplot->cairo_area = NULL;
6863 xyplot->cairo_export = NULL;
6864 xyplot->shift_key_pressed = FALSE;
6865 xyplot->control_key_pressed = FALSE;
6866
6867 xyplot->nObjectsText = 0;
6868 xyplot->objectsText = NULL;
6869 xyplot->t_key_pressed = FALSE;
6870 xyplot->selected_objects_text_num = -1;
6871
6872 xyplot->nObjectsLine = 0;
6873 xyplot->objectsLine = NULL;
6874 xyplot->l_key_pressed = FALSE;
6875 xyplot->selected_objects_line_num = -1;
6876 xyplot->selected_objects_line_type = -1;
6877
6878 xyplot->nObjectsImage = 0;
6879 xyplot->objectsImage = NULL;
6880 xyplot->i_key_pressed = FALSE;
6881 xyplot->selected_objects_image_num = -1;
6882
6883 xyplot->object_begin_point.x=-1;
6884 xyplot->object_begin_point.y=-1;
6885 xyplot->object_end_point.x=-1;
6886 xyplot->object_end_point.y=-1;
6887
6888 xyplot->r_key_pressed = FALSE;
6889 }
6890 /****************************************************************************************/
gabedit_xyplot_new()6891 GtkWidget* gabedit_xyplot_new ()
6892 {
6893 GabeditXYPlot *xyplot;
6894
6895 xyplot = g_object_new (GABEDIT_TYPE_XYPLOT, NULL);
6896
6897 return GTK_WIDGET (xyplot);
6898 }
6899 /****************************************************************************************/
gabedit_xyplot_destroy(GtkObject * object)6900 static void gabedit_xyplot_destroy (GtkObject *object)
6901 {
6902 GabeditXYPlot *xyplot;
6903
6904 g_return_if_fail (object != NULL);
6905 g_return_if_fail (G_IS_OBJECT (object));
6906 g_return_if_fail (GABEDIT_IS_XYPLOT (object));
6907
6908 xyplot = GABEDIT_XYPLOT (object);
6909
6910 if (xyplot->plotting_area && G_IS_OBJECT(xyplot->plotting_area))
6911 {
6912 g_object_unref(G_OBJECT(xyplot->plotting_area));
6913 xyplot->plotting_area = NULL;
6914 }
6915 if (xyplot->old_area && G_IS_OBJECT(xyplot->old_area))
6916 {
6917 g_object_unref(G_OBJECT(xyplot->old_area));
6918 xyplot->old_area = NULL;
6919 }
6920 if (xyplot->cairo_area)
6921 {
6922 cairo_destroy (xyplot->cairo_area);
6923 xyplot->cairo_area = NULL;
6924 }
6925 if (xyplot->cairo_widget)
6926 {
6927 cairo_destroy (xyplot->cairo_widget);
6928 xyplot->cairo_widget = NULL;
6929 }
6930
6931 if (xyplot->back_gc && G_IS_OBJECT(xyplot->back_gc))
6932 {
6933 g_object_unref(xyplot->back_gc);
6934 xyplot->back_gc = NULL;
6935 }
6936 if (xyplot->fore_gc && G_IS_OBJECT(xyplot->fore_gc))
6937 {
6938 g_object_unref(xyplot->fore_gc);
6939 xyplot->fore_gc = NULL;
6940 }
6941
6942 if (xyplot->data_gc && G_IS_OBJECT(xyplot->data_gc))
6943 {
6944 g_object_unref(xyplot->data_gc);
6945 xyplot->data_gc = NULL;
6946 }
6947
6948 if (xyplot->lines_gc && G_IS_OBJECT(xyplot->lines_gc))
6949 {
6950 g_object_unref(xyplot->lines_gc);
6951 xyplot->lines_gc = NULL;
6952 }
6953
6954 if (xyplot->hmajor_grid_gc && G_IS_OBJECT(xyplot->hmajor_grid_gc))
6955 {
6956 g_object_unref(xyplot->hmajor_grid_gc);
6957 xyplot->hmajor_grid_gc = NULL;
6958 }
6959
6960 if (xyplot->hminor_grid_gc && G_IS_OBJECT(xyplot->hminor_grid_gc))
6961 {
6962 g_object_unref(xyplot->hminor_grid_gc);
6963 xyplot->hminor_grid_gc = NULL;
6964 }
6965
6966 if (xyplot->vmajor_grid_gc && G_IS_OBJECT(xyplot->vmajor_grid_gc))
6967 {
6968 g_object_unref(xyplot->vmajor_grid_gc);
6969 xyplot->vmajor_grid_gc = NULL;
6970 }
6971
6972 if (xyplot->vminor_grid_gc && G_IS_OBJECT(xyplot->vminor_grid_gc))
6973 {
6974 g_object_unref(xyplot->vminor_grid_gc);
6975 xyplot->vminor_grid_gc = NULL;
6976 }
6977 if (xyplot->objectsLine)
6978 {
6979 g_free(xyplot->objectsLine);
6980 xyplot->objectsLine = NULL;
6981 }
6982 if (xyplot->objectsText)
6983 {
6984 gint i;
6985 for(i=0;i<xyplot->nObjectsText;i++)
6986 {
6987 if(xyplot->objectsText[i].str) g_free(xyplot->objectsText[i].str);
6988 if(xyplot->objectsText[i].pango) g_object_unref(G_OBJECT(xyplot->objectsText[i].pango));
6989 }
6990 g_free(xyplot->objectsText);
6991 xyplot->objectsText = NULL;
6992 }
6993
6994 if (GTK_OBJECT_CLASS (parent_class)->destroy)
6995 (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
6996
6997 gtk_object_destroy (object);
6998 }
6999 /****************************************************************************************/
xyplot_get_font_size(GtkWidget * widget,PangoFontDescription * font_desc)7000 static gint xyplot_get_font_size (GtkWidget* widget, PangoFontDescription* font_desc)
7001 {
7002 gint font_size = 8;
7003 if(!font_desc) return font_size;
7004 font_size = pango_font_description_get_size (font_desc) / PANGO_SCALE;
7005 return font_size;
7006 }
7007 /********************************************************************************/
gabedit_xyplot_grab(GtkWidget * widget,GdkEventCrossing * event)7008 static gint gabedit_xyplot_grab(GtkWidget* widget, GdkEventCrossing* event)
7009 {
7010 if(!event) return FALSE;
7011 switch(event->type)
7012 {
7013 case GDK_ENTER_NOTIFY:
7014 gtk_grab_add(GTK_WIDGET (widget));
7015 break;
7016 case GDK_LEAVE_NOTIFY:
7017 {
7018 GabeditXYPlot *xyplot = NULL;
7019 if(widget && GABEDIT_IS_XYPLOT (widget))
7020 xyplot = GABEDIT_XYPLOT (widget);
7021 gtk_grab_remove(GTK_WIDGET (widget));
7022 if(xyplot)
7023 {
7024 xyplot->shift_key_pressed = FALSE;
7025 xyplot->control_key_pressed = FALSE;
7026 }
7027 }
7028 break;
7029 default:
7030 break;
7031 }
7032 return TRUE;
7033 }
7034 /********************************************************************************/
gabedit_xyplot_key_press(GtkWidget * widget,GdkEventKey * event)7035 static gint gabedit_xyplot_key_press(GtkWidget* widget, GdkEventKey *event)
7036 {
7037 GabeditXYPlot *xyplot;
7038 g_return_val_if_fail (widget != NULL, FALSE);
7039 g_return_val_if_fail (GABEDIT_IS_XYPLOT (widget), FALSE);
7040 g_return_val_if_fail (event != NULL, FALSE);
7041
7042 xyplot = GABEDIT_XYPLOT (widget);
7043
7044 if((event->keyval == GDK_Shift_L || event->keyval == GDK_Shift_R) )
7045 xyplot->shift_key_pressed = TRUE;
7046 if((event->keyval == GDK_Control_L || event->keyval == GDK_Control_R) )
7047 xyplot->control_key_pressed = TRUE;
7048 if((event->keyval == GDK_Alt_L || event->keyval == GDK_Alt_L) )
7049 xyplot->control_key_pressed = TRUE;
7050
7051 if((event->keyval == GDK_c || event->keyval == GDK_C) )
7052 {
7053 if(xyplot->control_key_pressed)
7054 copyImageToClipBoard(widget);
7055
7056 }
7057 if((event->keyval == GDK_v || event->keyval == GDK_V) )
7058 {
7059 if(xyplot->control_key_pressed)
7060 {
7061 add_object_image(xyplot, 0, 0, -1, -1, NULL);
7062 gtk_widget_queue_draw(widget);
7063 }
7064 }
7065
7066 if((event->keyval == GDK_t || event->keyval == GDK_T) )
7067 xyplot->t_key_pressed = TRUE;
7068 if((event->keyval == GDK_l || event->keyval == GDK_L) )
7069 xyplot->l_key_pressed = TRUE;
7070 if((event->keyval == GDK_i || event->keyval == GDK_I) )
7071 xyplot->i_key_pressed = TRUE;
7072 if((event->keyval == GDK_r || event->keyval == GDK_R) )
7073 xyplot->r_key_pressed = TRUE;
7074 return TRUE;
7075 }
7076 /********************************************************************************/
gabedit_xyplot_key_release(GtkWidget * widget,GdkEventKey * event)7077 static gint gabedit_xyplot_key_release(GtkWidget* widget, GdkEventKey *event)
7078 {
7079 GabeditXYPlot *xyplot;
7080 g_return_val_if_fail (widget != NULL, FALSE);
7081 g_return_val_if_fail (GABEDIT_IS_XYPLOT (widget), FALSE);
7082 g_return_val_if_fail (event != NULL, FALSE);
7083
7084 xyplot = GABEDIT_XYPLOT (widget);
7085
7086 if((event->keyval == GDK_Shift_L || event->keyval == GDK_Shift_R) )
7087 xyplot->shift_key_pressed = FALSE;
7088 if((event->keyval == GDK_Control_L || event->keyval == GDK_Control_R) )
7089 xyplot->control_key_pressed = FALSE;
7090 if((event->keyval == GDK_Alt_L || event->keyval == GDK_Alt_R) )
7091 xyplot->control_key_pressed = FALSE;
7092 if((event->keyval == GDK_T || event->keyval == GDK_t) )
7093 xyplot->t_key_pressed = FALSE;
7094 if((event->keyval == GDK_l || event->keyval == GDK_L) )
7095 xyplot->l_key_pressed = FALSE;
7096 if((event->keyval == GDK_r || event->keyval == GDK_R) )
7097 xyplot->r_key_pressed = FALSE;
7098 return TRUE;
7099 }
7100 /****************************************************************************************/
gabedit_xyplot_realize(GtkWidget * widget)7101 static void gabedit_xyplot_realize (GtkWidget *widget)
7102 {
7103 GabeditXYPlot *xyplot;
7104 GdkWindowAttr attributes;
7105 gint attributes_mask;
7106 GdkGCValues gc_values;
7107 GdkGCValuesMask gc_values_mask;
7108 GdkColor black;
7109 GdkColor white;
7110 GdkColormap *colormap;
7111
7112 g_return_if_fail (widget != NULL);
7113 g_return_if_fail (GABEDIT_IS_XYPLOT (widget));
7114
7115 GTK_WIDGET_SET_FLAGS (widget, GTK_REALIZED);
7116 xyplot = GABEDIT_XYPLOT (widget);
7117
7118 attributes.x = widget->allocation.x;
7119 attributes.y = widget->allocation.y;
7120 attributes.width = widget->allocation.width;
7121 attributes.height = widget->allocation.height;
7122 attributes.wclass = GDK_INPUT_OUTPUT;
7123 attributes.window_type = GDK_WINDOW_CHILD;
7124 attributes.event_mask =
7125 ( gtk_widget_get_events (widget) |
7126 GDK_VISIBILITY_NOTIFY_MASK|
7127 GDK_EXPOSURE_MASK |
7128 GDK_LEAVE_NOTIFY_MASK | GDK_ENTER_NOTIFY_MASK |
7129 GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK |
7130 GDK_FOCUS_CHANGE_MASK |
7131 GDK_LEAVE_NOTIFY_MASK |
7132 GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK |
7133 GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK);
7134
7135 attributes.visual = gtk_widget_get_visual (widget);
7136 attributes.colormap = gtk_widget_get_colormap (widget);
7137
7138 attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP;
7139 widget->window = gdk_window_new (widget->parent->window, &attributes, attributes_mask);
7140
7141 widget->style = gtk_style_attach (widget->style, widget->window);
7142
7143 gdk_window_set_user_data (widget->window, widget);
7144
7145 gtk_style_set_background (widget->style, widget->window, GTK_STATE_ACTIVE);
7146
7147 colormap=gdk_drawable_get_colormap(widget->window);
7148
7149 black.red = 0;
7150 black.green = 0;
7151 black.blue = 0;
7152 gdk_colormap_alloc_color (colormap, &black, FALSE, TRUE);
7153
7154 white.red = 65535;
7155 white.green = 65535;
7156 white.blue = 65535;
7157 gdk_colormap_alloc_color (colormap, &white, FALSE, TRUE);
7158
7159
7160 gtk_widget_modify_bg (widget, GTK_STATE_NORMAL, &white);
7161 gtk_widget_modify_fg (widget, GTK_STATE_NORMAL, &black);
7162
7163 gc_values.foreground=white;
7164 gc_values.line_style=GDK_LINE_SOLID;
7165 gc_values.line_width=1;
7166 gc_values_mask=GDK_GC_FOREGROUND | GDK_GC_LINE_STYLE | GDK_GC_LINE_WIDTH;
7167 xyplot->back_gc=gdk_gc_new_with_values (widget->window, &gc_values, gc_values_mask);
7168
7169 gc_values.foreground=black;
7170 gc_values.line_style=GDK_LINE_SOLID;
7171 gc_values.line_width=2;
7172 gc_values_mask=GDK_GC_FOREGROUND | GDK_GC_LINE_STYLE | GDK_GC_LINE_WIDTH;
7173 xyplot->fore_gc=gdk_gc_new_with_values (widget->window, &gc_values, gc_values_mask);
7174
7175 gc_values.foreground=black;
7176 xyplot->hmajor_grid_gc=gdk_gc_new_with_values (widget->window, &gc_values, gc_values_mask);
7177 xyplot->vmajor_grid_gc=gdk_gc_new_with_values (widget->window, &gc_values, gc_values_mask);
7178
7179 gc_values.foreground=black;
7180 gc_values.line_style=GDK_LINE_ON_OFF_DASH;
7181 gc_values.line_width=1;
7182 gc_values_mask=GDK_GC_FOREGROUND | GDK_GC_LINE_STYLE | GDK_GC_LINE_WIDTH;
7183 xyplot->hminor_grid_gc=gdk_gc_new_with_values (widget->window, &gc_values, gc_values_mask);
7184 xyplot->vminor_grid_gc=gdk_gc_new_with_values (widget->window, &gc_values, gc_values_mask);
7185
7186 xyplot->data_gc=gdk_gc_new (widget->window);
7187
7188 gc_values.foreground=black;
7189 gc_values.line_style=GDK_LINE_SOLID;
7190 gc_values.line_width=2;
7191 gc_values_mask=GDK_GC_FOREGROUND | GDK_GC_LINE_STYLE | GDK_GC_LINE_WIDTH;
7192 xyplot->lines_gc=gdk_gc_new_with_values (widget->window, &gc_values, gc_values_mask);
7193
7194 xyplot->font_size = xyplot_get_font_size (widget, widget->style->font_desc);
7195
7196 /* Create the initial legends*/
7197 xyplot->v_legends_str = NULL;
7198 xyplot->h_legends_str = NULL;
7199 xyplot_build_legends(xyplot);
7200 xyplot_calculate_legends_sizes(xyplot);
7201 xyplot_calculate_sizes(xyplot);
7202 add_toolbar_and_popup_menu(widget, NULL);
7203 }
7204 /****************************************************************************************/
reset_theme(GtkWidget * widget,gint line_width,GdkColor * foreColor,GdkColor * backColor)7205 static void reset_theme(GtkWidget *widget, gint line_width, GdkColor* foreColor, GdkColor* backColor )
7206 {
7207 GabeditXYPlot *xyplot;
7208 GdkGCValues gc_values;
7209 GdkGCValuesMask gc_values_mask;
7210 GdkColormap *colormap;
7211
7212 g_return_if_fail (widget != NULL);
7213 g_return_if_fail (GABEDIT_IS_XYPLOT (widget));
7214
7215 xyplot = GABEDIT_XYPLOT (widget);
7216
7217 colormap=gdk_drawable_get_colormap(widget->window);
7218
7219 gdk_colormap_alloc_color (colormap, backColor, FALSE, TRUE);
7220 gdk_colormap_alloc_color (colormap, foreColor, FALSE, TRUE);
7221
7222 gtk_widget_modify_bg (widget, GTK_STATE_NORMAL, backColor);
7223 gtk_widget_modify_fg (widget, GTK_STATE_NORMAL, foreColor);
7224
7225 if (xyplot->back_gc && G_IS_OBJECT(xyplot->back_gc))
7226 {
7227 g_object_unref(xyplot->back_gc);
7228 xyplot->back_gc = NULL;
7229 }
7230 if (xyplot->fore_gc && G_IS_OBJECT(xyplot->fore_gc))
7231 {
7232 g_object_unref(xyplot->fore_gc);
7233 xyplot->fore_gc = NULL;
7234 }
7235
7236 if (xyplot->data_gc && G_IS_OBJECT(xyplot->data_gc))
7237 {
7238 g_object_unref(xyplot->data_gc);
7239 xyplot->data_gc = NULL;
7240 }
7241
7242
7243 if (xyplot->hmajor_grid_gc && G_IS_OBJECT(xyplot->hmajor_grid_gc))
7244 {
7245 g_object_unref(xyplot->hmajor_grid_gc);
7246 xyplot->hmajor_grid_gc = NULL;
7247 }
7248
7249 if (xyplot->hminor_grid_gc && G_IS_OBJECT(xyplot->hminor_grid_gc))
7250 {
7251 g_object_unref(xyplot->hminor_grid_gc);
7252 xyplot->hminor_grid_gc = NULL;
7253 }
7254
7255 if (xyplot->vmajor_grid_gc && G_IS_OBJECT(xyplot->vmajor_grid_gc))
7256 {
7257 g_object_unref(xyplot->vmajor_grid_gc);
7258 xyplot->vmajor_grid_gc = NULL;
7259 }
7260
7261 if (xyplot->vminor_grid_gc && G_IS_OBJECT(xyplot->vminor_grid_gc))
7262 {
7263 g_object_unref(xyplot->vminor_grid_gc);
7264 xyplot->vminor_grid_gc = NULL;
7265 }
7266
7267 gc_values.foreground=*backColor;
7268 gc_values.line_style=GDK_LINE_SOLID;
7269 gc_values.line_width=line_width;
7270 gc_values_mask=GDK_GC_FOREGROUND | GDK_GC_LINE_STYLE | GDK_GC_LINE_WIDTH;
7271 xyplot->back_gc=gdk_gc_new_with_values (widget->window, &gc_values, gc_values_mask);
7272
7273 gc_values.foreground=*foreColor;
7274 gc_values.line_style=GDK_LINE_SOLID;
7275 gc_values.line_width=line_width;
7276 gc_values_mask=GDK_GC_FOREGROUND | GDK_GC_LINE_STYLE | GDK_GC_LINE_WIDTH;
7277 xyplot->fore_gc=gdk_gc_new_with_values (widget->window, &gc_values, gc_values_mask);
7278
7279 gc_values.foreground=*foreColor;
7280 xyplot->hmajor_grid_gc=gdk_gc_new_with_values (widget->window, &gc_values, gc_values_mask);
7281 xyplot->vmajor_grid_gc=gdk_gc_new_with_values (widget->window, &gc_values, gc_values_mask);
7282
7283 gc_values.foreground=*foreColor;
7284 gc_values.line_style=GDK_LINE_ON_OFF_DASH;
7285 if(line_width/2>0) gc_values.line_width=line_width/2;
7286 else gc_values.line_width=line_width;
7287 gc_values_mask=GDK_GC_FOREGROUND | GDK_GC_LINE_STYLE | GDK_GC_LINE_WIDTH;
7288 xyplot->hminor_grid_gc=gdk_gc_new_with_values (widget->window, &gc_values, gc_values_mask);
7289 xyplot->vminor_grid_gc=gdk_gc_new_with_values (widget->window, &gc_values, gc_values_mask);
7290
7291 xyplot->data_gc=gdk_gc_new (widget->window);
7292
7293 if (xyplot->nObjectsLine<1)
7294 {
7295 if (xyplot->lines_gc && G_IS_OBJECT(xyplot->lines_gc))
7296 {
7297 g_object_unref(xyplot->lines_gc);
7298 xyplot->lines_gc = NULL;
7299 }
7300 gc_values.foreground=*foreColor;
7301 gc_values.line_style=GDK_LINE_SOLID;
7302 gc_values.line_width=line_width;
7303 gc_values_mask=GDK_GC_FOREGROUND | GDK_GC_LINE_STYLE | GDK_GC_LINE_WIDTH;
7304 xyplot->lines_gc=gdk_gc_new_with_values (widget->window, &gc_values, gc_values_mask);
7305 }
7306
7307 xyplot_build_legends(xyplot);
7308 xyplot_calculate_legends_sizes(xyplot);
7309 xyplot_calculate_sizes(xyplot);
7310 reset_object_text_pango(xyplot);
7311 }
7312 /****************************************************************************************/
set_theme_publication(GtkWidget * widget)7313 static void set_theme_publication(GtkWidget *widget)
7314 {
7315 GdkColor black;
7316 GdkColor white;
7317 gint line_width = 2;
7318 black.red = 0;
7319 black.green = 0;
7320 black.blue = 0;
7321
7322 white.red = 65535;
7323 white.green = 65535;
7324 white.blue = 65535;
7325 reset_theme(widget, line_width, &black, &white);
7326 }
7327 /****************************************************************************************/
set_theme_green_black(GtkWidget * widget)7328 static void set_theme_green_black(GtkWidget *widget)
7329 {
7330 GdkColor black;
7331 GdkColor green;
7332 gint line_width = 2;
7333 black.red = 0;
7334 black.green = 0;
7335 black.blue = 0;
7336
7337 green.red = 0;
7338 green.green = 65535;
7339 green.blue = 0;
7340 reset_theme(widget, line_width, &green, &black);
7341 }
7342 /****************************************************************************************/
theme_line_width_changed_value(GtkSpinButton * spinbutton,gpointer user_data)7343 static void theme_line_width_changed_value(GtkSpinButton *spinbutton, gpointer user_data)
7344 {
7345 if(user_data && G_IS_OBJECT(user_data))
7346 {
7347 GtkWidget* widget = GTK_WIDGET(user_data);
7348 GdkColor foreColor;
7349 GdkColor backColor;
7350 GdkGCValues gc_values;
7351 gint line_width = 1;
7352 GabeditXYPlot* xyplot = NULL;
7353 GdkColormap *colormap;
7354
7355 g_return_if_fail (GABEDIT_IS_XYPLOT (widget));
7356 xyplot = GABEDIT_XYPLOT(widget);
7357 colormap = gdk_window_get_colormap(widget->window);
7358
7359 gdk_gc_get_values(xyplot->back_gc, &gc_values);
7360 gdk_colormap_query_color(colormap, gc_values.foreground.pixel,&backColor);
7361 gdk_gc_get_values(xyplot->fore_gc, &gc_values);
7362 gdk_colormap_query_color(colormap, gc_values.foreground.pixel,&foreColor);
7363 line_width=gc_values.line_width;
7364 line_width = gtk_spin_button_get_value(spinbutton);
7365 reset_theme(widget, line_width, &foreColor, &backColor);
7366 }
7367 }
7368 /****************************************************************************************/
theme_back_color_changed_value(GtkColorButton * colorbutton,gpointer user_data)7369 static void theme_back_color_changed_value(GtkColorButton *colorbutton, gpointer user_data)
7370 {
7371 if(user_data && G_IS_OBJECT(user_data))
7372 {
7373 GtkWidget* widget = GTK_WIDGET(user_data);
7374 GdkColor foreColor;
7375 GdkColor backColor;
7376 GdkGCValues gc_values;
7377 gint line_width = 1;
7378 GabeditXYPlot* xyplot = NULL;
7379 GdkColormap *colormap;
7380
7381 g_return_if_fail (GABEDIT_IS_XYPLOT (widget));
7382 xyplot = GABEDIT_XYPLOT(widget);
7383 colormap = gdk_window_get_colormap(widget->window);
7384 gtk_color_button_get_color (colorbutton, &backColor);
7385 gdk_gc_get_values(xyplot->fore_gc, &gc_values);
7386 gdk_colormap_query_color(colormap, gc_values.foreground.pixel,&foreColor);
7387 line_width=gc_values.line_width;
7388 reset_theme(widget, line_width, &foreColor, &backColor);
7389
7390 }
7391 }
7392 /********************************************************************************************************/
theme_fore_color_changed_value(GtkColorButton * colorbutton,gpointer user_data)7393 static void theme_fore_color_changed_value(GtkColorButton *colorbutton, gpointer user_data)
7394 {
7395 if(user_data && G_IS_OBJECT(user_data))
7396 {
7397 GtkWidget* widget = GTK_WIDGET(user_data);
7398 GdkColor foreColor;
7399 GdkColor backColor;
7400 GdkGCValues gc_values;
7401 gint line_width = 1;
7402 GabeditXYPlot* xyplot = NULL;
7403 GdkColormap *colormap;
7404
7405 g_return_if_fail (GABEDIT_IS_XYPLOT (widget));
7406 xyplot = GABEDIT_XYPLOT(widget);
7407 colormap = gdk_window_get_colormap(widget->window);
7408 gtk_color_button_get_color (colorbutton, &foreColor);
7409 gdk_gc_get_values(xyplot->back_gc, &gc_values);
7410 gdk_colormap_query_color(colormap, gc_values.foreground.pixel,&backColor);
7411 line_width=gc_values.line_width;
7412 reset_theme(widget, line_width, &foreColor, &backColor);
7413 }
7414 }
7415 /********************************************************************************************************/
set_theme_dialog(GtkWidget * widget)7416 static void set_theme_dialog(GtkWidget* widget)
7417 {
7418 GtkWidget* window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7419 GtkWidget* frame = NULL;
7420 GtkWidget* hbox = NULL;
7421 GtkWidget* hbox1 = NULL;
7422 GtkWidget* label = NULL;
7423 GtkWidget* spin = NULL;
7424 GtkWidget* button = NULL;
7425 GtkWidget* buttonBack = NULL;
7426 GtkWidget* buttonFore = NULL;
7427 GtkWidget* parentWindow = NULL;
7428 GtkWidget* vbox_window = NULL;
7429 GdkColor foreColor;
7430 GdkColor backColor;
7431 GdkGCValues gc_values;
7432 gint line_width = 1;
7433 GabeditXYPlot* xyplot = NULL;
7434 GdkColormap *colormap;
7435
7436 g_return_if_fail (GABEDIT_IS_XYPLOT (widget));
7437 xyplot = GABEDIT_XYPLOT(widget);
7438 colormap = gdk_window_get_colormap(widget->window);
7439
7440 gdk_gc_get_values(xyplot->back_gc, &gc_values);
7441 gdk_colormap_query_color(colormap, gc_values.foreground.pixel,&backColor);
7442
7443 gdk_gc_get_values(xyplot->fore_gc, &gc_values);
7444 gdk_colormap_query_color(colormap, gc_values.foreground.pixel,&foreColor);
7445 line_width=gc_values.line_width;
7446
7447 gtk_window_set_title (GTK_WINDOW (window), _("Set theme"));
7448 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
7449 gtk_window_set_modal (GTK_WINDOW (window), TRUE);
7450
7451 g_signal_connect(G_OBJECT(window), "delete_event", G_CALLBACK(gtk_widget_destroy), (gpointer)xyplot);
7452
7453 vbox_window=gtk_vbox_new(FALSE, 0);
7454 gtk_container_add(GTK_CONTAINER(window), vbox_window);
7455 gtk_widget_show(vbox_window);
7456
7457 hbox1=gtk_hbox_new(FALSE, 0);
7458 gtk_box_pack_start(GTK_BOX(vbox_window), hbox1, TRUE, FALSE, 2);
7459 gtk_widget_show(hbox1);
7460
7461 frame = gtk_frame_new(NULL);
7462 gtk_box_pack_start(GTK_BOX(hbox1), frame, TRUE, FALSE, 2);
7463 gtk_widget_show(frame);
7464
7465 hbox=gtk_hbox_new(FALSE, 0);
7466 gtk_container_add(GTK_CONTAINER(frame), hbox);
7467 gtk_widget_show(hbox);
7468
7469 label=gtk_label_new(_("Line width :"));
7470 gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, FALSE, 2);
7471 gtk_widget_show(label);
7472
7473 spin = gtk_spin_button_new_with_range(0, 10, 1);
7474 gtk_spin_button_set_value(GTK_SPIN_BUTTON(spin), line_width);
7475 gtk_box_pack_start(GTK_BOX(hbox), spin, TRUE, FALSE, 2);
7476 gtk_widget_show(spin);
7477 g_object_set_data(G_OBJECT (window), "SpinLineWidth", spin);
7478
7479 label=gtk_label_new(_("Background color :"));
7480 gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, FALSE, 2);
7481 gtk_widget_show(label);
7482 button = gtk_color_button_new_with_color (&backColor);
7483 gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, FALSE, 2);
7484 gtk_widget_show(button);
7485 g_object_set_data(G_OBJECT (window), "BackColorButton", button);
7486 buttonBack = button;
7487
7488 label=gtk_label_new(_("Foreground color :"));
7489 gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, FALSE, 2);
7490 gtk_widget_show(label);
7491 button = gtk_color_button_new_with_color (&foreColor);
7492 gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, FALSE, 2);
7493 gtk_widget_show(button);
7494 g_object_set_data(G_OBJECT (window), "ForeColorButton", button);
7495 buttonFore = button;
7496
7497 g_signal_connect(G_OBJECT(spin), "value-changed", G_CALLBACK(theme_line_width_changed_value), xyplot);
7498 g_signal_connect(G_OBJECT(buttonBack), "color-set", G_CALLBACK(theme_back_color_changed_value), xyplot);
7499 g_signal_connect(G_OBJECT(buttonFore), "color-set", G_CALLBACK(theme_fore_color_changed_value), xyplot);
7500
7501 parentWindow = get_parent_window(GTK_WIDGET(xyplot));
7502 if(parentWindow)
7503 {
7504 gtk_window_set_transient_for(GTK_WINDOW(window),GTK_WINDOW(parentWindow));
7505 }
7506 gtk_widget_show(window);
7507 }
7508 /****************************************************************************************/
gabedit_xyplot_size_request(GtkWidget * widget,GtkRequisition * requisition)7509 static void gabedit_xyplot_size_request (GtkWidget *widget, GtkRequisition *requisition)
7510 {
7511 g_return_if_fail (widget != NULL);
7512 g_return_if_fail (GABEDIT_IS_XYPLOT (widget));
7513 g_return_if_fail (requisition != NULL);
7514
7515 requisition->width = XYPLOT_DEFAULT_SIZE;
7516 requisition->height = XYPLOT_DEFAULT_SIZE;
7517 }
7518 /****************************************************************************************/
gabedit_xyplot_size_allocate(GtkWidget * widget,GtkAllocation * allocation)7519 static void gabedit_xyplot_size_allocate (GtkWidget *widget, GtkAllocation *allocation)
7520 {
7521 GabeditXYPlot *xyplot;
7522
7523 g_return_if_fail (widget != NULL);
7524 g_return_if_fail (GABEDIT_IS_XYPLOT (widget));
7525 g_return_if_fail (allocation != NULL);
7526
7527 widget->allocation = *allocation;
7528 xyplot=GABEDIT_XYPLOT(widget);
7529
7530 if (GTK_WIDGET_REALIZED (widget))
7531 gdk_window_move_resize (widget->window,
7532 allocation->x,
7533 allocation->y,
7534 allocation->width,
7535 allocation->height);
7536
7537 xyplot_calculate_sizes(xyplot);
7538 }
7539 /****************************************************************************************/
draw_points(GtkWidget * widget,GabeditXYPlot * xyplot,XYPlotData * data)7540 static void draw_points(GtkWidget *widget, GabeditXYPlot *xyplot, XYPlotData* data)
7541 {
7542 gint i;
7543 gint x, y;
7544 GdkRectangle rect;
7545
7546 if ( data->point_size<1 ) return;
7547
7548 rect.x=0;
7549 rect.y=0;
7550 rect.width=widget->allocation.width;
7551 rect.height=widget->allocation.height;
7552 gdk_gc_set_rgb_fg_color (xyplot->data_gc, &data->point_color);
7553
7554 for (i=0; i<data->size; i++)
7555 /*
7556 if ((data->x[i] < xyplot->xmax) &&
7557 (data->x[i] > xyplot->xmin) &&
7558 (data->y[i] < xyplot->ymax) &&
7559 (data->y[i] > xyplot->ymin))
7560 */
7561 {
7562 value2pixel(xyplot, data->x[i], data->y[i], &x, &y);
7563 y=xyplot->plotting_rect.height-y;
7564 x -= data->point_width/2;
7565 y -= data->point_height/2;
7566 if(data->point_pango)
7567 xyplot_cairo_layout(xyplot, xyplot->cairo_area,
7568 x,
7569 y,
7570 data->point_pango,FALSE,FALSE,0);
7571 }
7572 }
7573 /****************************************************************************************/
draw_lines(GtkWidget * widget,GabeditXYPlot * xyplot,XYPlotData * data)7574 static void draw_lines(GtkWidget *widget, GabeditXYPlot *xyplot, XYPlotData* data)
7575 {
7576 GdkPoint* points;
7577 gint i;
7578 gboolean begin = TRUE;
7579 gint k,l;
7580
7581 if (data->line_width<1) return;
7582 points=(GdkPoint*)g_malloc( (sizeof(GdkPoint) * 2));
7583 gdk_gc_set_rgb_fg_color (xyplot->data_gc, &data->line_color);
7584 gdk_gc_set_line_attributes (xyplot->data_gc, data->line_width, data->line_style, GDK_CAP_ROUND, GDK_JOIN_MITER);
7585
7586 k = 0;
7587 l = 0;
7588 for (i=0; i<data->size; i++)
7589 /*
7590 if ((data->x[i] < xyplot->xmax) &&
7591 (data->x[i] > xyplot->xmin) &&
7592 (data->y[i] < xyplot->ymax) &&
7593 (data->y[i] > xyplot->ymin))
7594 */
7595 {
7596 l = i;
7597 value2pixel(xyplot, data->x[i], data->y[i], (gint *)&points[1].x, (gint *)&points[1].y);
7598 points[1].y=xyplot->plotting_rect.height-points[1].y;
7599 if(begin)
7600 {
7601 points[0] = points[1];
7602 begin = FALSE;
7603 k = i;
7604 continue;
7605 }
7606 if(k+1 ==l)
7607 {
7608 xyplot_cairo_lines(xyplot, xyplot->cairo_area, widget, xyplot->data_gc, points, 2);
7609 }
7610 k = l;
7611 points[0] = points[1];
7612 }
7613 g_free(points);
7614 }
7615 /****************************************************************************************/
draw_zoom_rectangle(GtkWidget * widget,GabeditXYPlot * xyplot)7616 static void draw_zoom_rectangle(GtkWidget *widget, GabeditXYPlot *xyplot)
7617 {
7618 if (!xyplot->mouse_zoom_enabled || xyplot->mouse_button != xyplot->mouse_zoom_button) return;
7619 gdk_draw_rectangle(widget->window,
7620 xyplot->fore_gc,
7621 FALSE,
7622 xyplot->zoom_rect.x,
7623 xyplot->zoom_rect.y,
7624 xyplot->zoom_rect.width,
7625 xyplot->zoom_rect.height);
7626 }
7627 /****************************************************************************************/
draw_object_line_gdk(GtkWidget * widget,GabeditXYPlot * xyplot)7628 static void draw_object_line_gdk(GtkWidget *widget, GabeditXYPlot *xyplot)
7629 {
7630 gint arrow_size = 0;
7631 gint i = -1;
7632 if (xyplot->object_begin_point.x<0 || xyplot->object_begin_point.y<0) return;
7633 if (xyplot->object_end_point.x<0 || xyplot->object_end_point.y<0) return;
7634 i = xyplot->selected_objects_line_num;
7635 if(i<0 && xyplot->nObjectsLine>0) i = xyplot->nObjectsLine-1;
7636
7637 if(i>-1)
7638 {
7639 gdk_gc_set_rgb_fg_color (xyplot->lines_gc, &xyplot->objectsLine[i].color);
7640 gdk_gc_set_line_attributes (xyplot->lines_gc,
7641 xyplot->objectsLine[i].width,
7642 /* xyplot->objectsLine[i].style, */
7643 GDK_LINE_ON_OFF_DASH,
7644 GDK_CAP_ROUND,
7645 GDK_JOIN_MITER);
7646 arrow_size = xyplot->objectsLine[i].arrow_size;
7647 }
7648 gdk_draw_line(widget->window, xyplot->lines_gc,
7649 xyplot->object_begin_point.x,
7650 xyplot->object_begin_point.y,
7651 xyplot->object_end_point.x,
7652 xyplot->object_end_point.y
7653 );
7654 if(arrow_size>0)
7655 {
7656 gdouble x1, y1, x2, y2;
7657 calc_arrow_vertexes(30.0, arrow_size*5.0,
7658 (gdouble)xyplot->object_begin_point.x,
7659 (gdouble)xyplot->object_begin_point.y,
7660 (gdouble)xyplot->object_end_point.x,
7661 (gdouble)xyplot->object_end_point.y,
7662 &x1, &y1,
7663 &x2, &y2
7664 );
7665 gdk_draw_line(widget->window, xyplot->lines_gc,
7666 (gint)x1,
7667 (gint)y1,
7668 xyplot->object_end_point.x,
7669 xyplot->object_end_point.y
7670 );
7671 gdk_draw_line(widget->window, xyplot->lines_gc,
7672 (gint)x2,
7673 (gint)y2,
7674 xyplot->object_end_point.x,
7675 xyplot->object_end_point.y
7676 );
7677 }
7678 }
7679 /****************************************************************************************/
get_rotated_rectangle(gint x,gint y,gint w,gint h,gdouble angle,gint * x1,gint * y1,gint * x2,gint * y2,gint * x3,gint * y3,gint * x4,gint * y4)7680 static void get_rotated_rectangle(
7681 gint x, gint y, gint w, gint h, gdouble angle,
7682 gint* x1, gint* y1,
7683 gint* x2, gint* y2,
7684 gint* x3, gint* y3,
7685 gint* x4, gint* y4)
7686 {
7687 gdouble a = -angle;
7688 gdouble cosa = cos(a);
7689 gdouble sina = sin(a);
7690 *x1 = x; *y1 = y;
7691 *x2 = (gint)(x+w*cosa); *y2 = (gint)(y+w*sina);
7692 *x3 = x+(gint)(w*cosa-h*sina); *y3 = (gint)(y+w*sina+h*cosa);
7693 *x4 = (gint)(x-h*sina); *y4 = (gint)(y+h*cosa);
7694 }
7695 /*****************************************************************************************************************/
draw_rotated_rectangle(GtkWidget * widget,GabeditXYPlot * xyplot,gint x,gint y,gint w,gint h,gdouble angle)7696 static void draw_rotated_rectangle(GtkWidget *widget, GabeditXYPlot* xyplot,
7697 gint x, gint y, gint w, gint h, gdouble angle)
7698 {
7699 static GdkPoint* points = NULL;
7700 if(!points) points = g_malloc(4*sizeof(GdkPoint));
7701 get_rotated_rectangle( x, y, w, h, angle,
7702 &points[0].x, &points[0].y,
7703 &points[1].x, &points[1].y,
7704 &points[2].x, &points[2].y,
7705 &points[3].x, &points[3].y);
7706 gdk_draw_polygon(widget->window, xyplot->fore_gc, FALSE, points, 4);
7707 }
7708 /****************************************************************************************/
draw_selected_objects_text_rectangle(GtkWidget * widget,GabeditXYPlot * xyplot)7709 static void draw_selected_objects_text_rectangle(GtkWidget *widget, GabeditXYPlot *xyplot)
7710 {
7711 gint i = xyplot->selected_objects_text_num;
7712 gdouble angle = 0;
7713 if(i<0 || i>=xyplot->nObjectsText) return;
7714 if (xyplot->mouse_zoom_enabled && xyplot->mouse_button == xyplot->mouse_zoom_button) return;
7715 /*
7716 gdk_draw_rectangle(widget->window,
7717 xyplot->fore_gc,
7718 FALSE,
7719 xyplot->objectsText[i].xi,
7720 xyplot->objectsText[i].yi,
7721 xyplot->objectsText[i].width,
7722 xyplot->objectsText[i].height);
7723 */
7724 angle = xyplot->objectsText[i].angle;
7725 draw_rotated_rectangle(widget, xyplot,
7726 xyplot->objectsText[i].xi,
7727 xyplot->objectsText[i].yi,
7728 xyplot->objectsText[i].width,
7729 xyplot->objectsText[i].height,
7730 angle);
7731 }
7732 /****************************************************************************************/
draw_selected_objects_image_rectangle(GtkWidget * widget,GabeditXYPlot * xyplot)7733 static void draw_selected_objects_image_rectangle(GtkWidget *widget, GabeditXYPlot *xyplot)
7734 {
7735 gint i = xyplot->selected_objects_image_num;
7736 if(i<0 || i>=xyplot->nObjectsImage) return;
7737 if (xyplot->mouse_zoom_enabled && xyplot->mouse_button == xyplot->mouse_zoom_button) return;
7738 gdk_draw_rectangle(widget->window,
7739 xyplot->fore_gc,
7740 FALSE,
7741 xyplot->objectsImage[i].xi,
7742 xyplot->objectsImage[i].yi,
7743 xyplot->objectsImage[i].widthi,
7744 xyplot->objectsImage[i].heighti);
7745 }
7746 /****************************************************************************************/
draw_distance_line(GtkWidget * widget,GabeditXYPlot * xyplot)7747 static void draw_distance_line(GtkWidget *widget, GabeditXYPlot *xyplot)
7748 {
7749 PangoLayout *playout;
7750 GdkRectangle rect;
7751 gchar begin[100]=" ";
7752 gchar end[100] = " ";
7753 gdouble x1,y1,x2,y2;
7754 gint x,y;
7755
7756
7757 if (!xyplot->mouse_distance_enabled || xyplot->mouse_button != xyplot->mouse_distance_button) return;
7758
7759 x=xyplot->distance_rect.x;
7760 y=xyplot->distance_rect.y;
7761 if(gabedit_xyplot_get_point(GABEDIT_XYPLOT(xyplot), x, y, &x1, &y1))
7762 sprintf(begin,"(%f ; %f)",x1,y1);
7763 x = xyplot->distance_rect.x+xyplot->distance_rect.width;
7764 y = xyplot->distance_rect.y+xyplot->distance_rect.height;
7765 if(gabedit_xyplot_get_point(GABEDIT_XYPLOT(xyplot), x, y, &x2, &y2))
7766 sprintf(end,"(%f ; %f)",x2,y2);
7767 rect.x=0;
7768 rect.y=0;
7769 rect.width=widget->allocation.width;
7770 rect.height=widget->allocation.height;
7771 playout=gtk_widget_create_pango_layout (widget, begin);
7772 if(!playout) return;
7773 gtk_paint_layout (widget->style, widget->window,
7774 GTK_STATE_NORMAL, FALSE,
7775 &rect, widget, NULL,
7776 xyplot->distance_rect.x,
7777 xyplot->distance_rect.y,
7778 playout);
7779 if (playout) g_object_unref(G_OBJECT(playout));
7780 playout=gtk_widget_create_pango_layout (widget, end);
7781 gtk_paint_layout (widget->style, widget->window,
7782 GTK_STATE_NORMAL, FALSE,
7783 &rect, widget, NULL,
7784 xyplot->distance_rect.x+xyplot->distance_rect.width,
7785 xyplot->distance_rect.y+xyplot->distance_rect.height,
7786 playout);
7787 if (playout) g_object_unref(G_OBJECT(playout));
7788 gdk_draw_line(widget->window,
7789 xyplot->fore_gc,
7790 xyplot->distance_rect.x,
7791 xyplot->distance_rect.y,
7792 xyplot->distance_rect.x+xyplot->distance_rect.width,
7793 xyplot->distance_rect.y+xyplot->distance_rect.height);
7794
7795 }
7796 /****************************************************************************************/
draw_hminor_ticks(GtkWidget * widget,GabeditXYPlot * xyplot)7797 static void draw_hminor_ticks(GtkWidget *widget, GabeditXYPlot *xyplot)
7798 {
7799 gint i;
7800 gint j;
7801 if (xyplot->hmajor_ticks<2 || xyplot->hminor_ticks == 0 ) return;
7802 for (i=0; i < xyplot->hmajor_ticks-1; i++)
7803 for (j=1; j <= xyplot->hminor_ticks; j++)
7804 {
7805 if (xyplot->show_bottom_legends)
7806 xyplot_cairo_line(xyplot, xyplot->cairo_widget, widget,
7807 xyplot->fore_gc,
7808 xyplot->plotting_rect.x+i*xyplot->d_hminor*(xyplot->hminor_ticks+1)+j*xyplot->d_hminor,
7809 xyplot->plotting_rect.y+xyplot->plotting_rect.height,
7810 xyplot->plotting_rect.x+i*xyplot->d_hminor*(xyplot->hminor_ticks+1)+j*xyplot->d_hminor,
7811 xyplot->plotting_rect.y+xyplot->plotting_rect.height+xyplot->length_ticks);
7812 if (xyplot->show_top_legends)
7813 xyplot_cairo_line(xyplot, xyplot->cairo_widget, widget,
7814 xyplot->fore_gc,
7815 xyplot->plotting_rect.x+i*xyplot->d_hminor*(xyplot->hminor_ticks+1)+j*xyplot->d_hminor,
7816 xyplot->plotting_rect.y,
7817 xyplot->plotting_rect.x+i*xyplot->d_hminor*(xyplot->hminor_ticks+1)+j*xyplot->d_hminor,
7818 xyplot->plotting_rect.y-xyplot->length_ticks);
7819 }
7820 }
7821 /****************************************************************************************/
draw_hmajor_ticks_and_xlegends(GtkWidget * widget,GabeditXYPlot * xyplot)7822 static void draw_hmajor_ticks_and_xlegends(GtkWidget *widget, GabeditXYPlot *xyplot)
7823 {
7824 gint i;
7825 GdkRectangle rect;
7826
7827 rect.x=0;
7828 rect.y=0;
7829 rect.width=widget->allocation.width;
7830 rect.height=widget->allocation.height;
7831
7832 if (xyplot->hmajor_ticks>1)
7833 for (i=0; i < xyplot->hmajor_ticks; i++)
7834 {
7835 gint l1 = i;
7836 if(xyplot->reflect_x) l1 = xyplot->hmajor_ticks-i-1;
7837 if (xyplot->show_bottom_legends)
7838 xyplot_cairo_line(xyplot, xyplot->cairo_widget, widget,
7839 xyplot->fore_gc,
7840 xyplot->plotting_rect.x+i*xyplot->d_hmajor,
7841 xyplot->plotting_rect.y+xyplot->plotting_rect.height,
7842 xyplot->plotting_rect.x+i*xyplot->d_hmajor,
7843 xyplot->plotting_rect.y+xyplot->plotting_rect.height+xyplot->length_ticks*2);
7844 if (xyplot->show_top_legends)
7845 xyplot_cairo_line(xyplot, xyplot->cairo_widget, widget,
7846 xyplot->fore_gc,
7847 xyplot->plotting_rect.x+i*xyplot->d_hmajor,
7848 xyplot->plotting_rect.y,
7849 xyplot->plotting_rect.x+i*xyplot->d_hmajor,
7850 xyplot->plotting_rect.y-xyplot->length_ticks*2);
7851
7852 if (xyplot->x_legends_digits!=0 && xyplot->show_bottom_legends)
7853 xyplot_cairo_string(xyplot, xyplot->cairo_widget, widget, xyplot->fore_gc,
7854 xyplot->plotting_rect.x+i*xyplot->d_hmajor-0.5*xyplot->x_legends_width,
7855 xyplot->plotting_rect.y+xyplot->plotting_rect.height+xyplot->length_ticks*2,
7856 xyplot->h_legends_str[l1], FALSE, FALSE,0);
7857 if (xyplot->x_legends_digits!=0 && xyplot->show_top_legends)
7858 xyplot_cairo_string(xyplot, xyplot->cairo_widget, widget, xyplot->fore_gc,
7859 xyplot->plotting_rect.x+i*xyplot->d_hmajor-0.5*xyplot->x_legends_width,
7860 xyplot->plotting_rect.y-xyplot->length_ticks*2-xyplot->x_legends_height,
7861 xyplot->h_legends_str[l1], FALSE, FALSE,0);
7862 }
7863 if ( xyplot->h_label && xyplot->x_legends_digits!=0 && xyplot->show_bottom_legends)
7864 {
7865 xyplot_cairo_layout(xyplot, xyplot->cairo_widget,
7866 xyplot->plotting_rect.x+0.5*xyplot->plotting_rect.width,
7867 xyplot->plotting_rect.y+xyplot->plotting_rect.height+xyplot->length_ticks*2+xyplot->x_legends_height,
7868 xyplot->h_label,TRUE,FALSE,0);
7869 }
7870 if (xyplot->h_label && xyplot->x_legends_digits!=0 && xyplot->show_top_legends && !xyplot->show_bottom_legends)
7871 {
7872 xyplot_cairo_layout(xyplot, xyplot->cairo_widget,
7873 xyplot->plotting_rect.x+0.5*xyplot->plotting_rect.width,
7874 xyplot->plotting_rect.y-xyplot->x_legends_height-xyplot->length_ticks*2-xyplot->h_label_height,
7875 xyplot->h_label,TRUE,FALSE,0);
7876 }
7877 }
7878
7879 /****************************************************************************************/
xyplot_cairo_line_grid(GabeditXYPlot * xyplot,cairo_t * cr,GtkWidget * widget,GdkGC * gc,gdouble x1,gdouble y1,gdouble x2,gdouble y2)7880 static void xyplot_cairo_line_grid(GabeditXYPlot *xyplot, cairo_t* cr, GtkWidget* widget, GdkGC* gc, gdouble x1,gdouble y1,gdouble x2,gdouble y2)
7881 {
7882 gabedit_xyplot_cairo_line(cr, widget, gc, x1, y1, x2, y2);
7883 if(xyplot->cairo_export)
7884 {
7885 x1+= xyplot->plotting_rect.x;
7886 x2+= xyplot->plotting_rect.x;
7887 y1+= xyplot->plotting_rect.y;
7888 y2+= xyplot->plotting_rect.y;
7889 gabedit_xyplot_cairo_line(xyplot->cairo_export, widget, gc, x1, y1, x2, y2);
7890 }
7891 }
7892 /****************************************************************************************/
draw_hminor_grid(GtkWidget * widget,GabeditXYPlot * xyplot)7893 static void draw_hminor_grid(GtkWidget *widget, GabeditXYPlot *xyplot)
7894 {
7895 gint i;
7896 gint j;
7897 if (xyplot->hminor_grid && (xyplot->vmajor_ticks > 1) && (xyplot->vminor_ticks != 0))
7898 for (i=0; i < xyplot->vmajor_ticks-1; i++)
7899 for (j=1; j <= xyplot->vminor_ticks; j++)
7900 {
7901 xyplot_cairo_line_grid(xyplot, xyplot->cairo_area, widget,
7902 xyplot->hminor_grid_gc,
7903 0,
7904 i*xyplot->d_vmajor+j*xyplot->d_vminor,
7905 xyplot->plotting_rect.width,
7906 i*xyplot->d_vmajor+j*xyplot->d_vminor);
7907 }
7908 }
7909 /****************************************************************************************/
draw_hmajor_grid(GtkWidget * widget,GabeditXYPlot * xyplot)7910 static void draw_hmajor_grid(GtkWidget *widget, GabeditXYPlot *xyplot)
7911 {
7912 gint i;
7913
7914 if (xyplot->hmajor_grid && (xyplot->vmajor_ticks > 1) )
7915 for (i=1; i < (xyplot->vmajor_ticks-1); i++)
7916 xyplot_cairo_line_grid(xyplot, xyplot->cairo_area, widget,
7917 xyplot->hmajor_grid_gc,
7918 0,
7919 i*xyplot->d_vmajor,
7920 xyplot->plotting_rect.width,
7921 i*xyplot->d_vmajor);
7922 }
7923 /****************************************************************************************/
draw_vminor_ticks(GtkWidget * widget,GabeditXYPlot * xyplot)7924 static void draw_vminor_ticks(GtkWidget *widget, GabeditXYPlot *xyplot)
7925 {
7926 gint i;
7927 gint j;
7928
7929 if ( (xyplot->vmajor_ticks > 1) && (xyplot->vminor_ticks != 0) )
7930 for (i=0; i < xyplot->vmajor_ticks-1; i++)
7931 for (j=1; j <= xyplot->vminor_ticks; j++)
7932 {
7933 if (xyplot->show_left_legends)
7934 xyplot_cairo_line(xyplot, xyplot->cairo_widget, widget,
7935 xyplot->fore_gc,
7936 xyplot->plotting_rect.x,
7937 xyplot->plotting_rect.y+i*xyplot->d_vminor*(xyplot->vminor_ticks+1)+j*xyplot->d_vminor,
7938 xyplot->plotting_rect.x-xyplot->length_ticks,
7939 xyplot->plotting_rect.y+i*xyplot->d_vminor*(xyplot->vminor_ticks+1)+j*xyplot->d_vminor);
7940 if (xyplot->show_right_legends)
7941 xyplot_cairo_line(xyplot, xyplot->cairo_widget, widget,
7942 xyplot->fore_gc,
7943 xyplot->plotting_rect.x+xyplot->plotting_rect.width,
7944 xyplot->plotting_rect.y+i*xyplot->d_vminor*(xyplot->vminor_ticks+1)+j*xyplot->d_vminor,
7945 xyplot->plotting_rect.x+xyplot->plotting_rect.width+xyplot->length_ticks,
7946 xyplot->plotting_rect.y+i*xyplot->d_vminor*(xyplot->vminor_ticks+1)+j*xyplot->d_vminor);
7947 }
7948 }
7949 /****************************************************************************************/
draw_vmajor_ticks_and_ylegends(GtkWidget * widget,GabeditXYPlot * xyplot)7950 static void draw_vmajor_ticks_and_ylegends(GtkWidget *widget, GabeditXYPlot *xyplot)
7951 {
7952 gint i;
7953 GdkRectangle rect;
7954
7955 rect.x=0;
7956 rect.y=0;
7957 rect.width=widget->allocation.width;
7958 rect.height=widget->allocation.height;
7959
7960 if (xyplot->vmajor_ticks>1)
7961 for (i=0; i < xyplot->vmajor_ticks; i++)
7962 {
7963 gint l1 = i;
7964 if(xyplot->reflect_y) l1 = xyplot->vmajor_ticks-i-1;
7965 if (xyplot->show_left_legends)
7966 xyplot_cairo_line(xyplot, xyplot->cairo_widget, widget,
7967 xyplot->fore_gc,
7968 xyplot->plotting_rect.x,
7969 xyplot->plotting_rect.y+i*xyplot->d_vmajor,
7970 xyplot->plotting_rect.x-xyplot->length_ticks*2,
7971 xyplot->plotting_rect.y+i*xyplot->d_vmajor);
7972 if (xyplot->show_right_legends)
7973 xyplot_cairo_line(xyplot, xyplot->cairo_widget, widget,
7974 xyplot->fore_gc,
7975 xyplot->plotting_rect.x+xyplot->plotting_rect.width,
7976 xyplot->plotting_rect.y+i*xyplot->d_vmajor,
7977 xyplot->plotting_rect.x+xyplot->plotting_rect.width+xyplot->length_ticks*2,
7978 xyplot->plotting_rect.y+i*xyplot->d_vmajor);
7979
7980 if (xyplot->y_legends_digits!=0 && xyplot->show_left_legends)
7981 xyplot_cairo_string(xyplot, xyplot->cairo_widget, widget, xyplot->fore_gc,
7982 xyplot->plotting_rect.x-xyplot->y_legends_width-xyplot->length_ticks*2-2,
7983 xyplot->plotting_rect.y+xyplot->plotting_rect.height-i*xyplot->d_vmajor,
7984 xyplot->v_legends_str[l1], FALSE, TRUE,0);
7985 if (xyplot->y_legends_digits!=0 && xyplot->show_right_legends)
7986 xyplot_cairo_string(xyplot, xyplot->cairo_widget, widget, xyplot->fore_gc,
7987 xyplot->plotting_rect.x+xyplot->plotting_rect.width+xyplot->length_ticks*2+2,
7988 xyplot->plotting_rect.y+xyplot->plotting_rect.height-i*xyplot->d_vmajor,
7989 xyplot->v_legends_str[l1], FALSE, TRUE,0);
7990 }
7991 if (xyplot->v_label && xyplot->y_legends_digits!=0 && xyplot->show_left_legends)
7992 {
7993 xyplot_cairo_layout(xyplot, xyplot->cairo_widget,
7994 xyplot->plotting_rect.x-xyplot->y_legends_width-xyplot->length_ticks*2-xyplot->v_label_height,
7995 xyplot->plotting_rect.y+0.5*xyplot->plotting_rect.height,
7996 xyplot->v_label,FALSE,TRUE,-M_PI/2);
7997 }
7998 if (xyplot->v_label && xyplot->y_legends_digits!=0 && xyplot->show_right_legends && !xyplot->show_left_legends)
7999 {
8000 xyplot_cairo_layout(xyplot, xyplot->cairo_widget,
8001 xyplot->plotting_rect.x+xyplot->plotting_rect.width+xyplot->y_legends_width+xyplot->length_ticks*2,
8002 xyplot->plotting_rect.y+0.5*xyplot->plotting_rect.height,
8003 xyplot->v_label,FALSE,TRUE,-M_PI/2);
8004 }
8005 }
8006 /****************************************************************************************/
draw_vminor_grid(GtkWidget * widget,GabeditXYPlot * xyplot)8007 static void draw_vminor_grid(GtkWidget *widget, GabeditXYPlot *xyplot)
8008 {
8009 gint i;
8010 gint j;
8011 if (xyplot->vminor_grid && (xyplot->hmajor_ticks > 1) && (xyplot->hminor_ticks != 0) )
8012 for (i=0; i < xyplot->hmajor_ticks-1; i++)
8013 for (j=1; j <= xyplot->hminor_ticks; j++)
8014 xyplot_cairo_line_grid(xyplot, xyplot->cairo_area, widget,
8015 xyplot->vminor_grid_gc,
8016 i*xyplot->d_hmajor+j*xyplot->d_hminor,
8017 0,
8018 i*xyplot->d_hmajor+j*xyplot->d_hminor,
8019 xyplot->plotting_rect.height);
8020 }
8021 /****************************************************************************************/
draw_vmajor_grid(GtkWidget * widget,GabeditXYPlot * xyplot)8022 static void draw_vmajor_grid(GtkWidget *widget, GabeditXYPlot *xyplot)
8023 {
8024 gint i;
8025 if (xyplot->vmajor_grid && (xyplot->hmajor_ticks > 1))
8026 for (i=1; i < (xyplot->hmajor_ticks-1); i++)
8027 xyplot_cairo_line_grid(xyplot, xyplot->cairo_area, widget,
8028 xyplot->vmajor_grid_gc,
8029 i*xyplot->d_hmajor,
8030 0,
8031 i*xyplot->d_hmajor,
8032 xyplot->plotting_rect.height);
8033 }
8034 /****************************************************************************************/
draw_objects_text(GtkWidget * widget,GabeditXYPlot * xyplot)8035 static void draw_objects_text(GtkWidget *widget, GabeditXYPlot *xyplot)
8036 {
8037 gint i;
8038 for (i=0; i < xyplot->nObjectsText; i++)
8039 if(xyplot->objectsText[i].pango)
8040 {
8041 /*
8042 if (
8043 !(
8044 (xyplot->objectsText[i].xi > xyplot->plotting_rect.x) &&
8045 (xyplot->objectsText[i].xi < (xyplot->plotting_rect.x + xyplot->plotting_rect.width)) &&
8046 (xyplot->objectsText[i].yi > xyplot->plotting_rect.y) &&
8047 (xyplot->objectsText[i].yi < (xyplot->plotting_rect.y + xyplot->plotting_rect.height))
8048 )
8049 ) continue;
8050 */
8051 xyplot_cairo_layout(xyplot, xyplot->cairo_widget,
8052 xyplot->objectsText[i].xi,
8053 xyplot->objectsText[i].yi,
8054 xyplot->objectsText[i].pango,FALSE,FALSE,-xyplot->objectsText[i].angle);
8055 }
8056 }
8057 /****************************************************************************************/
draw_objects_line(GtkWidget * widget,GabeditXYPlot * xyplot)8058 static void draw_objects_line(GtkWidget *widget, GabeditXYPlot *xyplot)
8059 {
8060 gint i;
8061 for (i=0; i < xyplot->nObjectsLine; i++)
8062 {
8063 /*
8064 if (
8065 !(
8066 (xyplot->objectsLine[i].x1i > xyplot->plotting_rect.x) &&
8067 (xyplot->objectsLine[i].x1i < (xyplot->plotting_rect.x + xyplot->plotting_rect.width)) &&
8068 (xyplot->objectsLine[i].y1i > xyplot->plotting_rect.y) &&
8069 (xyplot->objectsLine[i].y1i < (xyplot->plotting_rect.y + xyplot->plotting_rect.height))
8070 )
8071 ) continue;
8072 if (
8073 !(
8074 (xyplot->objectsLine[i].x2i > xyplot->plotting_rect.x) &&
8075 (xyplot->objectsLine[i].x2i < (xyplot->plotting_rect.x + xyplot->plotting_rect.width)) &&
8076 (xyplot->objectsLine[i].y2i > xyplot->plotting_rect.y) &&
8077 (xyplot->objectsLine[i].y2i < (xyplot->plotting_rect.y + xyplot->plotting_rect.height))
8078 )
8079 ) continue;
8080 */
8081 /* HERE change gc vlaues */
8082 gdouble x1, x2, y1, y2;
8083 gdk_gc_set_rgb_fg_color (xyplot->lines_gc, &xyplot->objectsLine[i].color);
8084 gdk_gc_set_line_attributes (xyplot->lines_gc,
8085 xyplot->objectsLine[i].width,
8086 xyplot->objectsLine[i].style,
8087 GDK_CAP_ROUND,
8088 GDK_JOIN_MITER);
8089
8090 xyplot_cairo_line(xyplot, xyplot->cairo_widget, widget,
8091 xyplot->lines_gc,
8092 xyplot->objectsLine[i].x1i,
8093 xyplot->objectsLine[i].y1i,
8094 xyplot->objectsLine[i].x2i,
8095 xyplot->objectsLine[i].y2i);
8096 if(xyplot->objectsLine[i].arrow_size<1) continue;
8097 calc_arrow_vertexes(30.0, xyplot->objectsLine[i].arrow_size*5.0,
8098 (gdouble)xyplot->objectsLine[i].x1i,
8099 (gdouble)xyplot->objectsLine[i].y1i,
8100 (gdouble)xyplot->objectsLine[i].x2i,
8101 (gdouble)xyplot->objectsLine[i].y2i,
8102 &x1, &y1,
8103 &x2, &y2
8104 );
8105 xyplot_cairo_line(xyplot, xyplot->cairo_widget, widget,
8106 xyplot->lines_gc,
8107 (gint)x1,
8108 (gint)y1,
8109 xyplot->objectsLine[i].x2i,
8110 xyplot->objectsLine[i].y2i);
8111 xyplot_cairo_line(xyplot, xyplot->cairo_widget, widget,
8112 xyplot->lines_gc,
8113 (gint)x2,
8114 (gint)y2,
8115 xyplot->objectsLine[i].x2i,
8116 xyplot->objectsLine[i].y2i);
8117 }
8118 }
8119 /****************************************************************************************/
draw_objects_image(GtkWidget * widget,GabeditXYPlot * xyplot)8120 static void draw_objects_image(GtkWidget *widget, GabeditXYPlot *xyplot)
8121 {
8122 gint i;
8123 for (i=0; i < xyplot->nObjectsImage; i++)
8124 if(xyplot->objectsImage[i].image)
8125 {
8126 /*
8127 if (
8128 !(
8129 (xyplot->objectsImage[i].xi > xyplot->plotting_rect.x) &&
8130 (xyplot->objectsImage[i].xi < (xyplot->plotting_rect.x + xyplot->plotting_rect.width)) &&
8131 (xyplot->objectsImage[i].yi > xyplot->plotting_rect.y) &&
8132 (xyplot->objectsImage[i].yi < (xyplot->plotting_rect.y + xyplot->plotting_rect.height))
8133 )
8134 ) continue;
8135 */
8136 xyplot_cairo_image(xyplot, xyplot->cairo_widget, widget,
8137 xyplot->objectsImage[i].xi , xyplot->objectsImage[i].yi,
8138 xyplot->objectsImage[i].widthi, xyplot->objectsImage[i].heighti,
8139 xyplot->objectsImage[i].image);
8140 }
8141 }
8142 /****************************************************************************************/
clean_borders(GtkWidget * widget,GabeditXYPlot * xyplot)8143 static void clean_borders(GtkWidget *widget, GabeditXYPlot *xyplot)
8144 {
8145 if(xyplot->cairo_export)
8146 {
8147 xyplot_cairo_rectangle(xyplot, xyplot->cairo_export, widget, xyplot->back_gc,
8148 TRUE,
8149 0,
8150 0,
8151 xyplot->plotting_rect.x,
8152 widget->allocation.height);
8153 xyplot_cairo_rectangle(xyplot, xyplot->cairo_export, widget, xyplot->back_gc,
8154 TRUE,
8155 0,
8156 0,
8157 widget->allocation.width,
8158 xyplot->plotting_rect.y
8159 );
8160 xyplot_cairo_rectangle(xyplot, xyplot->cairo_export, widget, xyplot->back_gc,
8161 TRUE,
8162 0,
8163 xyplot->plotting_rect.y+xyplot->plotting_rect.height,
8164 widget->allocation.width,
8165 widget->allocation.height-xyplot->plotting_rect.y-xyplot->plotting_rect.height
8166 );
8167 xyplot_cairo_rectangle(xyplot, xyplot->cairo_export, widget, xyplot->back_gc,
8168 TRUE,
8169 xyplot->plotting_rect.x+xyplot->plotting_rect.width,
8170 0,
8171 widget->allocation.width-xyplot->plotting_rect.x-xyplot->plotting_rect.width,
8172 widget->allocation.height
8173 );
8174 }
8175 }
8176 /****************************************************************************************/
draw_borders(GtkWidget * widget,GabeditXYPlot * xyplot)8177 static void draw_borders(GtkWidget *widget, GabeditXYPlot *xyplot)
8178 {
8179 gboolean rectangle = xyplot->show_rectangle_legends;
8180 if(rectangle)
8181 xyplot_cairo_rectangle(
8182 xyplot, xyplot->cairo_widget, widget,
8183 xyplot->fore_gc,
8184 FALSE,
8185 xyplot->plotting_rect.x,
8186 xyplot->plotting_rect.y,
8187 xyplot->plotting_rect.width,
8188 xyplot->plotting_rect.height);
8189 else
8190 {
8191 if(xyplot->show_left_legends)
8192 {
8193 gdouble x1 = xyplot->plotting_rect.x;
8194 gdouble y1 = xyplot->plotting_rect.y;
8195 gdouble x2 = xyplot->plotting_rect.x;
8196 gdouble y2 = xyplot->plotting_rect.y+xyplot->plotting_rect.height;
8197 xyplot_cairo_line( xyplot, xyplot->cairo_widget, widget, xyplot->fore_gc, x1, y1, x2, y2);
8198 }
8199 if(xyplot->show_right_legends)
8200 {
8201 gdouble x1 = xyplot->plotting_rect.x+xyplot->plotting_rect.width;
8202 gdouble y1 = xyplot->plotting_rect.y;
8203 gdouble x2 = xyplot->plotting_rect.x+xyplot->plotting_rect.width;
8204 gdouble y2 = xyplot->plotting_rect.y+xyplot->plotting_rect.height;
8205 xyplot_cairo_line( xyplot, xyplot->cairo_widget, widget, xyplot->fore_gc, x1, y1, x2, y2);
8206 }
8207 if(xyplot->show_top_legends)
8208 {
8209 gdouble x1 = xyplot->plotting_rect.x;
8210 gdouble y1 = xyplot->plotting_rect.y;
8211 gdouble x2 = xyplot->plotting_rect.x+xyplot->plotting_rect.width;
8212 gdouble y2 = xyplot->plotting_rect.y;
8213 xyplot_cairo_line( xyplot, xyplot->cairo_widget, widget, xyplot->fore_gc, x1, y1, x2, y2);
8214 }
8215 if(xyplot->show_bottom_legends)
8216 {
8217 gdouble x1 = xyplot->plotting_rect.x;
8218 gdouble y1 = xyplot->plotting_rect.y+xyplot->plotting_rect.height;
8219 gdouble x2 = xyplot->plotting_rect.x+xyplot->plotting_rect.width;
8220 gdouble y2 = xyplot->plotting_rect.y+xyplot->plotting_rect.height;
8221 xyplot_cairo_line( xyplot, xyplot->cairo_widget, widget, xyplot->fore_gc, x1, y1, x2, y2);
8222 }
8223
8224 }
8225 }
8226 /****************************************************************************************/
draw_background(GtkWidget * widget,GabeditXYPlot * xyplot)8227 static void draw_background(GtkWidget *widget, GabeditXYPlot *xyplot)
8228 {
8229 GdkRectangle rect;
8230
8231 rect.x=0;
8232 rect.y=0;
8233 rect.width=widget->allocation.width;
8234 rect.height=widget->allocation.height;
8235
8236 gtk_paint_flat_box (widget->style,
8237 widget->window,
8238 GTK_STATE_NORMAL,
8239 GTK_SHADOW_NONE,
8240 &rect,
8241 widget,
8242 NULL,
8243 0,
8244 0,
8245 -1,
8246 -1);
8247
8248 /* Filling the plotting area*/
8249 xyplot_cairo_rectangle(xyplot, xyplot->cairo_area, widget, xyplot->back_gc,
8250 TRUE,
8251 0,
8252 0,
8253 xyplot->plotting_rect.width,
8254 xyplot->plotting_rect.height);
8255 if(xyplot->cairo_export)
8256 {
8257 xyplot_cairo_rectangle(xyplot, xyplot->cairo_export, widget, xyplot->back_gc,
8258 TRUE,
8259 xyplot->plotting_rect.x,
8260 xyplot->plotting_rect.y,
8261 xyplot->plotting_rect.width,
8262 xyplot->plotting_rect.height);
8263 }
8264
8265 }
8266 /****************************************************************************************/
draw_data(GtkWidget * widget,GabeditXYPlot * xyplot)8267 static void draw_data(GtkWidget *widget, GabeditXYPlot *xyplot)
8268 {
8269 XYPlotData *data = NULL;
8270 GList *current = NULL;
8271
8272 if(xyplot->data_list)
8273 for(current=g_list_first(xyplot->data_list); current!=NULL; current=current->next)
8274 {
8275 data=(XYPlotData*)current->data;
8276 draw_lines(widget, xyplot, data);
8277 draw_points(widget, xyplot, data);
8278 }
8279
8280 }
8281 /****************************************************************************************/
gdk_pixmap_copy(GdkPixmap * pixmap)8282 static GdkPixmap* gdk_pixmap_copy(GdkPixmap *pixmap)
8283 {
8284 GdkPixmap *pixmap_out;
8285 GdkGC *gc;
8286 gint width, height, depth;
8287
8288 g_return_val_if_fail(pixmap != NULL, NULL);
8289
8290 gdk_drawable_get_size(pixmap, &width, &height);
8291 depth = gdk_drawable_get_depth(pixmap);
8292 pixmap_out = gdk_pixmap_new(NULL, width, height, depth);
8293 gc = gdk_gc_new(pixmap);
8294 gdk_draw_drawable(pixmap_out, gc, pixmap, 0, 0, 0, 0, width, height);
8295 g_object_unref(gc);
8296 return pixmap_out;
8297 }
8298 /****************************************************************************************/
set_old_area(GtkWidget * widget,GabeditXYPlot * xyplot)8299 static void set_old_area(GtkWidget *widget, GabeditXYPlot *xyplot)
8300 {
8301 if (xyplot->old_area!=NULL) g_object_unref(G_OBJECT(xyplot->old_area));
8302 xyplot->old_area=NULL;
8303
8304 if (GTK_WIDGET_REALIZED(widget) && widget->window)
8305 {
8306 xyplot->old_area=gdk_pixmap_copy(widget->window);
8307 }
8308 }
8309 /****************************************************************************************/
draw_plotting_area(GtkWidget * widget,GabeditXYPlot * xyplot)8310 static void draw_plotting_area(GtkWidget *widget, GabeditXYPlot *xyplot)
8311 {
8312 gdk_draw_drawable (widget->window,
8313 xyplot->back_gc,
8314 xyplot->plotting_area,
8315 0,
8316 0,
8317 xyplot->plotting_rect.x,
8318 xyplot->plotting_rect.y,
8319 xyplot->plotting_rect.width,
8320 xyplot->plotting_rect.height);
8321
8322 }
8323 /****************************************************************************************/
gabedit_xyplot_expose(GtkWidget * widget,GdkEventExpose * event)8324 static gint gabedit_xyplot_expose (GtkWidget *widget, GdkEventExpose *event)
8325 {
8326 GabeditXYPlot *xyplot;
8327
8328 g_return_val_if_fail (widget != NULL, FALSE);
8329 g_return_val_if_fail (GABEDIT_IS_XYPLOT (widget), FALSE);
8330 g_return_val_if_fail (event != NULL, FALSE);
8331
8332 if (event->count > 0) return FALSE;
8333 xyplot=GABEDIT_XYPLOT(widget);
8334
8335 if (xyplot->mouse_zoom_enabled && xyplot->mouse_button == xyplot->mouse_zoom_button)
8336 {
8337 gint width;
8338 gint height;
8339 gdk_drawable_get_size(xyplot->old_area, &width, &height);
8340 gdk_draw_drawable (widget->window,
8341 xyplot->back_gc,
8342 xyplot->old_area,
8343 0,
8344 0,
8345 0,
8346 0,
8347 width,
8348 height
8349 );
8350 draw_zoom_rectangle(widget, xyplot);
8351 return TRUE;
8352 }
8353 if (xyplot->mouse_distance_enabled && xyplot->mouse_button == xyplot->mouse_distance_button)
8354 {
8355 gint width;
8356 gint height;
8357 gdk_drawable_get_size(xyplot->old_area, &width, &height);
8358 gdk_draw_drawable (widget->window,
8359 xyplot->back_gc,
8360 xyplot->old_area,
8361 0,
8362 0,
8363 0,
8364 0,
8365 width,
8366 height
8367 );
8368 draw_distance_line(widget, xyplot);
8369 return TRUE;
8370 }
8371 if (xyplot->selected_objects_text_num>-1)
8372 {
8373 gint width;
8374 gint height;
8375 gdk_drawable_get_size(xyplot->old_area, &width, &height);
8376 gdk_draw_drawable (widget->window,
8377 xyplot->back_gc,
8378 xyplot->old_area,
8379 0,
8380 0,
8381 0,
8382 0,
8383 width,
8384 height
8385 );
8386 draw_selected_objects_text_rectangle(widget, xyplot);
8387 return TRUE;
8388 }
8389 if (xyplot->selected_objects_image_num>-1)
8390 {
8391 gint width;
8392 gint height;
8393 gdk_drawable_get_size(xyplot->old_area, &width, &height);
8394 gdk_draw_drawable (widget->window,
8395 xyplot->back_gc,
8396 xyplot->old_area,
8397 0,
8398 0,
8399 0,
8400 0,
8401 width,
8402 height
8403 );
8404 draw_selected_objects_image_rectangle(widget, xyplot);
8405 return TRUE;
8406 }
8407 if (xyplot->object_begin_point.x>-1)
8408 {
8409 gint width;
8410 gint height;
8411 gdk_drawable_get_size(xyplot->old_area, &width, &height);
8412 gdk_draw_drawable (widget->window,
8413 xyplot->back_gc,
8414 xyplot->old_area,
8415 0,
8416 0,
8417 0,
8418 0,
8419 width,
8420 height
8421 );
8422 draw_object_line_gdk(widget, xyplot);
8423 return TRUE;
8424 }
8425
8426 if (xyplot->cairo_widget)
8427 {
8428 cairo_destroy (xyplot->cairo_widget);
8429 xyplot->cairo_widget = gdk_cairo_create (widget->window);
8430 }
8431 if (xyplot->cairo_area)
8432 {
8433 cairo_destroy (xyplot->cairo_area);
8434 xyplot->cairo_area = gdk_cairo_create (xyplot->plotting_area);
8435 }
8436
8437 draw_background(widget, xyplot);
8438
8439 draw_vmajor_grid(widget, xyplot);
8440 draw_hminor_grid(widget, xyplot);
8441 draw_hmajor_grid(widget, xyplot);
8442 draw_vminor_grid(widget, xyplot);
8443
8444 draw_data(widget, xyplot);
8445
8446 clean_borders(widget, xyplot);/* for export */
8447 draw_borders(widget, xyplot);
8448
8449
8450 draw_hminor_ticks(widget, xyplot);
8451 draw_hmajor_ticks_and_xlegends(widget, xyplot);
8452 draw_vminor_ticks(widget, xyplot);
8453 draw_vmajor_ticks_and_ylegends(widget, xyplot);
8454
8455 draw_plotting_area(widget, xyplot);
8456
8457
8458 /* draw_zoom_rectangle(widget, xyplot);*/
8459 /* draw_distance_line(widget, xyplot);*/
8460
8461 draw_objects_image(widget, xyplot);
8462 draw_objects_line(widget, xyplot);
8463 draw_objects_text(widget, xyplot);
8464
8465 return 0;
8466 }
8467 /****************************************************************************************/
get_distance_M_AB(GabeditXYPlot * xyplot,gint xM,gint yM,gint ixA,gint iyA,gint ixB,gint iyB)8468 static gint get_distance_M_AB(GabeditXYPlot *xyplot,gint xM, gint yM, gint ixA, gint iyA, gint ixB, gint iyB)
8469 {
8470 gdouble xA = ixA;
8471 gdouble yA = iyA;
8472 gdouble xB = ixB;
8473 gdouble yB = iyB;
8474 gdouble xAB = xB -xA;
8475 gdouble yAB = yB -yA;
8476 gdouble AB2 = xAB*xAB + yAB*yAB;
8477 gdouble xMA;
8478 gdouble yMA;
8479 gdouble MA2;
8480 gdouble xMB;
8481 gdouble yMB;
8482 gdouble MB2;
8483 gdouble xC;
8484 gdouble yC;
8485 gdouble xMC;
8486 gdouble yMC;
8487 gdouble MC2;
8488
8489 do{
8490 xMA = xA -xM;
8491 yMA = yA -yM;
8492 MA2 = xMA*xMA + yMA*yMA;
8493 xMB = xB -xM;
8494 yMB = yB -yM;
8495 MB2 = xMB*xMB + yMB*yMB;
8496 xC = (xA + xB)/2.0;
8497 yC = (yA + yB)/2.0;
8498 xMC = xC - xM;
8499 yMC = yC - yM;
8500 MC2 = xMC*xMC + yMC*yMC;
8501 if(MA2>MB2)
8502 {
8503 if(MC2<MA2)
8504 {
8505 xA = xC;
8506 yA = yC;
8507 }
8508 else
8509 {
8510 xB = xC;
8511 yB = yC;
8512 }
8513 }
8514 else
8515 {
8516 if(MC2<MB2)
8517 {
8518 xB = xC;
8519 yB = yC;
8520 }
8521 else
8522 {
8523 xA = xC;
8524 yA = yC;
8525 }
8526 }
8527 xAB = xB -xA;
8528 yAB = yB -yA;
8529 AB2 = xAB*xAB + yAB*yAB;
8530 }while(AB2>1);
8531 return (gint)sqrt(MC2);
8532 }
8533 /****************************************************************************************/
gabedit_xyplot_double_click(GtkWidget * widget,GdkEventButton * event)8534 static gint gabedit_xyplot_double_click (GtkWidget *widget, GdkEventButton *event)
8535 {
8536 XYPlotData *data;
8537 GList* current = NULL;
8538 gint x;
8539 gint y;
8540 gboolean OK = FALSE;
8541 GabeditXYPlot *xyplot = NULL;
8542 gint loop;
8543 gint xOld;
8544 gint yOld;
8545 gint i = 0;
8546
8547 xyplot=GABEDIT_XYPLOT(widget);
8548 /* test on objects label */
8549 i = get_object_text_num(xyplot, event->x, event->y);
8550 if(i>-1 && i<xyplot->nObjectsText)
8551 {
8552 xyplot->selected_objects_text_num = -1;
8553 add_set_object_text_dialog(GTK_WIDGET(xyplot), i, 0,0);
8554 return TRUE;
8555 }
8556 /* test on objects line */
8557 i = get_object_line_num(xyplot, event->x, event->y);
8558 if(i>-1 && i<xyplot->nObjectsLine)
8559 {
8560 xyplot->selected_objects_line_num = -1;
8561 xyplot->selected_objects_line_type = -1;
8562 xyplot->object_begin_point.x = -1;
8563 xyplot->object_begin_point.y = -1;
8564 xyplot->object_end_point.x = -1;
8565 xyplot->object_end_point.y = -1;
8566 set_object_line_dialog(xyplot, i);
8567 return TRUE;
8568 }
8569 /* test on objects image */
8570 i = get_object_image_num(xyplot, event->x, event->y);
8571 if(i>-1 && i<xyplot->nObjectsImage)
8572 {
8573 xyplot->selected_objects_image_num = -1;
8574 xyplot->object_begin_point.x = -1;
8575 xyplot->object_begin_point.y = -1;
8576 xyplot->object_end_point.x = -1;
8577 xyplot->object_end_point.y = -1;
8578 add_set_object_image_dialog(GTK_WIDGET(xyplot), i, 0,0);
8579 return TRUE;
8580 }
8581 if (
8582 !(
8583 (event->x > xyplot->plotting_rect.x) &&
8584 (event->x < (xyplot->plotting_rect.x + xyplot->plotting_rect.width)) &&
8585 (event->y > xyplot->plotting_rect.y) &&
8586 (event->y < (xyplot->plotting_rect.y + xyplot->plotting_rect.height))
8587 )
8588 )
8589 {
8590 set_all_dialog(widget);
8591 return TRUE;
8592 }
8593
8594 if(!(xyplot->data_list)) return TRUE;
8595 current=g_list_first(xyplot->data_list);
8596 for(; current != NULL; current = current->next)
8597 {
8598 data = (XYPlotData*)current->data;
8599 xOld = 0;
8600 yOld = 0;
8601 for(loop=0;loop<data->size;loop++)
8602 {
8603 value2pixel(xyplot, data->x[loop], data->y[loop], &x, &y);
8604 y=xyplot->plotting_rect.height-y;
8605 x += xyplot->plotting_rect.x;
8606 y += xyplot->plotting_rect.y;
8607 if(loop ==0 && abs(x-event->x)<5 && abs(y-event->y)<5)
8608 {
8609 OK = TRUE;
8610 break;
8611 }
8612 if(loop >0 && get_distance_M_AB(xyplot,(gint)event->x, (gint)event->y, (gint)xOld, (gint)yOld, (gint)x, (gint)y)<5)
8613 {
8614 OK = TRUE;
8615 break;
8616 }
8617 xOld = x;
8618 yOld = y;
8619 }
8620 if(OK) break;
8621 }
8622 if(OK)
8623 {
8624 set_data_dialog(xyplot,data);
8625 }
8626 return OK;
8627 }
8628 /*********************************************************************************************************************/
popuo_menu(GtkWidget * widget,guint button,guint32 time)8629 static gboolean popuo_menu(GtkWidget* widget, guint button, guint32 time)
8630 {
8631 GtkUIManager *manager = g_object_get_data(G_OBJECT (widget), "Manager");
8632 GtkWidget *menu = gtk_ui_manager_get_widget (manager, "/MenuXYPlot");
8633 if (GTK_IS_MENU (menu))
8634 {
8635 gtk_menu_popup (GTK_MENU (menu), NULL, NULL, NULL, NULL, button, time);
8636 return TRUE;
8637 }
8638 else
8639 {
8640 g_message (_("popup menu of xyplot failed"));
8641 }
8642 return FALSE;
8643 }
8644 /****************************************************************************************/
gabedit_xyplot_button_press(GtkWidget * widget,GdkEventButton * event)8645 static gint gabedit_xyplot_button_press (GtkWidget *widget, GdkEventButton *event)
8646 {
8647 GabeditXYPlot *xyplot;
8648
8649 g_return_val_if_fail (widget != NULL, FALSE);
8650 g_return_val_if_fail (GABEDIT_IS_XYPLOT (widget), FALSE);
8651 g_return_val_if_fail (event != NULL, FALSE);
8652
8653 xyplot = GABEDIT_XYPLOT (widget);
8654 if(event->type == GDK_2BUTTON_PRESS)
8655 {
8656 xyplot->double_click = TRUE;
8657 return gabedit_xyplot_double_click(widget,event);
8658 }
8659 if(event->button == 3)
8660 {
8661 return popuo_menu(widget, event->button, event->time);
8662 }
8663
8664 if (xyplot->mouse_zoom_enabled && (event->button == xyplot->mouse_zoom_button || (event->button == 1 && xyplot->control_key_pressed )) )
8665 if ( (event->x > xyplot->plotting_rect.x) &&
8666 (event->x < (xyplot->plotting_rect.x + xyplot->plotting_rect.width)) &&
8667 (event->y > xyplot->plotting_rect.y) &&
8668 (event->y < (xyplot->plotting_rect.y + xyplot->plotting_rect.height)) ){
8669 xyplot->mouse_button=xyplot->mouse_zoom_button;
8670
8671 xyplot->zoom_point.x=event->x;
8672 xyplot->zoom_point.y=event->y;
8673 set_old_area(widget, xyplot);
8674 }
8675 if (xyplot->mouse_distance_enabled && (event->button == xyplot->mouse_distance_button && xyplot->shift_key_pressed ) )
8676 if ( (event->x > xyplot->plotting_rect.x) &&
8677 (event->x < (xyplot->plotting_rect.x + xyplot->plotting_rect.width)) &&
8678 (event->y > xyplot->plotting_rect.y) &&
8679 (event->y < (xyplot->plotting_rect.y + xyplot->plotting_rect.height)) ){
8680 xyplot->mouse_button=xyplot->mouse_distance_button;
8681
8682 xyplot->distance_point.x=event->x;
8683 xyplot->distance_point.y=event->y;
8684 set_old_area(widget, xyplot);
8685 }
8686
8687 if (xyplot->mouse_displace_enabled && (event->button == xyplot->mouse_displace_button))
8688 if ( (event->x > xyplot->plotting_rect.x) &&
8689 (event->x < (xyplot->plotting_rect.x + xyplot->plotting_rect.width)) &&
8690 (event->y > xyplot->plotting_rect.y) &&
8691 (event->y < (xyplot->plotting_rect.y + xyplot->plotting_rect.height)) ){
8692 xyplot->mouse_button=event->button;
8693
8694 xyplot->move_point.x=event->x;
8695 xyplot->move_point.y=event->y;
8696 }
8697 if (xyplot->r_key_pressed && !xyplot->control_key_pressed){
8698 gint i;
8699 xyplot->r_key_pressed = FALSE;
8700 i = get_object_text_num(xyplot, event->x, event->y);
8701 if(i>-1) delete_object_text(GTK_WIDGET(xyplot), i);
8702 else
8703 {
8704 i = get_object_line_num(xyplot, event->x, event->y);
8705 if(i>-1) delete_object_line(GTK_WIDGET(xyplot), i);
8706 else
8707 {
8708 i = get_object_image_num(xyplot, event->x, event->y);
8709 if(i>-1) delete_object_image(GTK_WIDGET(xyplot), i);
8710 }
8711 }
8712 }
8713 if (
8714 !xyplot->t_key_pressed &&
8715 !xyplot->l_key_pressed &&
8716 !xyplot->i_key_pressed &&
8717 !xyplot->shift_key_pressed &&
8718 !xyplot->control_key_pressed &&
8719 event->button != xyplot->mouse_zoom_button
8720 )
8721
8722 /*
8723 if ( (event->x > xyplot->plotting_rect.x) &&
8724 (event->x < (xyplot->plotting_rect.x + xyplot->plotting_rect.width)) &&
8725 (event->y > xyplot->plotting_rect.y) &&
8726 (event->y < (xyplot->plotting_rect.y + xyplot->plotting_rect.height)) )
8727 */
8728 {
8729
8730 gdouble X, Y;
8731 gchar txt[BSIZE];
8732 PangoLayout *playout;
8733 gint i;
8734
8735 if(gabedit_xyplot_get_point(GABEDIT_XYPLOT(xyplot), event->x, event->y, &X, &Y))
8736 sprintf(txt,"(%f ; %f)",X,Y);
8737 playout=gtk_widget_create_pango_layout (widget, txt);
8738 if(playout)
8739 {
8740 GdkRectangle rect;
8741 rect.x=0;
8742 rect.y=0;
8743 rect.width=widget->allocation.width;
8744 rect.height=widget->allocation.height;
8745 gtk_paint_layout (widget->style, widget->window,
8746 GTK_STATE_NORMAL, FALSE,
8747 &rect, widget, NULL,
8748 event->x,
8749 event->y,
8750 playout);
8751 g_object_unref(G_OBJECT(playout));
8752 }
8753 i = get_object_text_num(xyplot, event->x, event->y);
8754 if(i>-1 && i<xyplot->nObjectsText) xyplot->selected_objects_text_num = i;
8755 else xyplot->selected_objects_text_num = -1;
8756 if(xyplot->selected_objects_text_num>-1)
8757 {
8758 set_old_area(widget, xyplot);
8759 gtk_widget_queue_draw(GTK_WIDGET(xyplot));
8760 }
8761 if(xyplot->selected_objects_text_num<0)
8762 {
8763 i = get_object_line_num(xyplot, event->x, event->y);
8764 xyplot->selected_objects_line_num = -1;
8765 xyplot->selected_objects_line_type = -1;
8766 if(i>-1 && i<xyplot->nObjectsLine)
8767 {
8768 gdouble xx,yy,d;
8769 xyplot->selected_objects_line_num = i;
8770 xyplot->selected_objects_line_type = 0;
8771 xyplot->object_begin_point.x=xyplot->objectsLine[i].x1i;
8772 xyplot->object_begin_point.y=xyplot->objectsLine[i].y1i;
8773 xyplot->object_end_point.x=xyplot->objectsLine[i].x2i;
8774 xyplot->object_end_point.y=xyplot->objectsLine[i].y2i;
8775 xx = event->x-xyplot->objectsLine[i].x1i;
8776 yy = event->y-xyplot->objectsLine[i].y1i;
8777 d = xx*xx+yy*yy;
8778 xx = event->x-xyplot->objectsLine[i].x2i;
8779 yy = event->y-xyplot->objectsLine[i].y2i;
8780 if(d<xx*xx+yy*yy) xyplot->selected_objects_line_type = 1;
8781 set_old_area(widget, xyplot);
8782 gtk_widget_queue_draw(GTK_WIDGET(xyplot));
8783 }
8784
8785 }
8786 if(xyplot->selected_objects_text_num<0 && xyplot->selected_objects_line_num<0)
8787 {
8788 i = get_object_image_num(xyplot, event->x, event->y);
8789 if(i>-1 && i<xyplot->nObjectsImage) xyplot->selected_objects_image_num = i;
8790 else xyplot->selected_objects_image_num = -1;
8791 if(xyplot->selected_objects_image_num>-1)
8792 {
8793 gdouble xx = -event->x+xyplot->objectsImage[i].xi+xyplot->objectsImage[i].widthi;
8794 gdouble yy = -event->y+xyplot->objectsImage[i].yi+xyplot->objectsImage[i].heighti;
8795 if(xx*xx+yy*yy<
8796 (xyplot->objectsImage[i].widthi*xyplot->objectsImage[i].widthi+
8797 xyplot->objectsImage[i].heighti*xyplot->objectsImage[i].heighti)/100
8798 )
8799 {
8800 xyplot->object_begin_point.x=-1;
8801 xyplot->object_begin_point.y=-1;
8802 xyplot->object_end_point.x=(gint)fabs(xx);
8803 xyplot->object_end_point.y=(gint)fabs(yy);
8804 }
8805 else
8806 {
8807 xyplot->object_begin_point.x=event->x-xyplot->objectsImage[i].xi;
8808 xyplot->object_begin_point.y=event->y-xyplot->objectsImage[i].yi;
8809 xyplot->object_end_point.x=-1;
8810 xyplot->object_end_point.y=-1;
8811 }
8812 set_old_area(widget, xyplot);
8813 gtk_widget_queue_draw(GTK_WIDGET(xyplot));
8814 }
8815 }
8816
8817 }
8818 if (xyplot->t_key_pressed && !xyplot->control_key_pressed)
8819 /*
8820 if ( (event->x > xyplot->plotting_rect.x) &&
8821 (event->x < (xyplot->plotting_rect.x + xyplot->plotting_rect.width)) &&
8822 (event->y > xyplot->plotting_rect.y) &&
8823 (event->y < (xyplot->plotting_rect.y + xyplot->plotting_rect.height)) )
8824 */
8825 {
8826
8827 gdouble X, Y;
8828
8829 if(gabedit_xyplot_get_point(GABEDIT_XYPLOT(xyplot), event->x, event->y, &X, &Y))
8830 {
8831 xyplot->t_key_pressed = FALSE;
8832 add_set_object_text_dialog(GTK_WIDGET(xyplot), -1, X, Y);
8833 }
8834
8835 }
8836 if (xyplot->l_key_pressed && !xyplot->control_key_pressed)
8837 /*
8838 if ( (event->x > xyplot->plotting_rect.x) &&
8839 (event->x < (xyplot->plotting_rect.x + xyplot->plotting_rect.width)) &&
8840 (event->y > xyplot->plotting_rect.y) &&
8841 (event->y < (xyplot->plotting_rect.y + xyplot->plotting_rect.height)) )
8842 */
8843 {
8844
8845 set_old_area(widget, xyplot);
8846 xyplot->l_key_pressed = FALSE;
8847 xyplot->object_begin_point.x=event->x;
8848 xyplot->object_begin_point.y=event->y;
8849 xyplot->object_end_point.x=-1;
8850 xyplot->object_end_point.y=-1;
8851
8852 }
8853 if (xyplot->i_key_pressed && !xyplot->control_key_pressed)
8854 /*
8855 if ( (event->x > xyplot->plotting_rect.x) &&
8856 (event->x < (xyplot->plotting_rect.x + xyplot->plotting_rect.width)) &&
8857 (event->y > xyplot->plotting_rect.y) &&
8858 (event->y < (xyplot->plotting_rect.y + xyplot->plotting_rect.height)) )
8859 */
8860 {
8861 xyplot->i_key_pressed = FALSE;
8862 add_set_object_image_dialog(GTK_WIDGET(xyplot), -1, event->x, event->y);
8863 }
8864 if ( xyplot->mouse_autorange_enabled &&
8865 (event->button == xyplot->mouse_autorange_button) )
8866 gabedit_xyplot_set_autorange(xyplot, NULL);
8867
8868 xyplot->double_click = FALSE;
8869
8870 return FALSE;
8871 }
8872 /****************************************************************************************/
gabedit_xyplot_button_release(GtkWidget * widget,GdkEventButton * event)8873 static gint gabedit_xyplot_button_release (GtkWidget *widget, GdkEventButton *event)
8874 {
8875 GabeditXYPlot *xyplot;
8876 gdouble xmin, xmax, ymin, ymax;
8877 gint xleft, ytop, xright, ybottom;
8878
8879 g_return_val_if_fail (widget != NULL, FALSE);
8880 g_return_val_if_fail (GABEDIT_IS_XYPLOT (widget), FALSE);
8881 g_return_val_if_fail (event != NULL, FALSE);
8882
8883 xyplot = GABEDIT_XYPLOT (widget);
8884
8885 xyplot->selected_objects_text_num=-1;
8886
8887 if (xyplot->selected_objects_image_num>-1)
8888 {
8889 xyplot->object_begin_point.x=-1;
8890 xyplot->object_begin_point.y=-1;
8891 xyplot->object_end_point.x=-1;
8892 xyplot->object_end_point.y=-1;
8893 xyplot->selected_objects_image_num=-1;
8894 }
8895 if (xyplot->selected_objects_line_num>-1)
8896 {
8897 xyplot->object_begin_point.x=-1;
8898 xyplot->object_begin_point.y=-1;
8899 xyplot->object_end_point.x=-1;
8900 xyplot->object_end_point.y=-1;
8901 xyplot->selected_objects_line_num=-1;
8902 xyplot->selected_objects_line_type=-1;
8903 }
8904
8905 /* Zoom */
8906 if ( !xyplot->double_click && xyplot->mouse_zoom_enabled &&
8907 (xyplot->mouse_button == xyplot->mouse_zoom_button)){
8908
8909 xleft=xyplot->zoom_rect.x-xyplot->plotting_rect.x;
8910 xright=xyplot->zoom_rect.x+xyplot->zoom_rect.width-xyplot->plotting_rect.x;
8911 ybottom=xyplot->plotting_rect.y+xyplot->plotting_rect.height-xyplot->zoom_rect.y-xyplot->zoom_rect.height;
8912 ytop=xyplot->plotting_rect.y+xyplot->plotting_rect.height-xyplot->zoom_rect.y;
8913
8914 pixel2value(xyplot, xleft, ybottom, &xmin, &ymin);
8915 pixel2value(xyplot, xright, ytop, &xmax, &ymax);
8916
8917 if(xyplot->reflect_x)
8918 {
8919 gdouble a = xmin;
8920 xmin = xmax;
8921 xmax = a;
8922 }
8923 if(xyplot->reflect_y)
8924 {
8925 gdouble a = ymin;
8926 ymin = ymax;
8927 ymax = a;
8928 }
8929
8930 gabedit_xyplot_set_range(xyplot, xmin, xmax, ymin, ymax);
8931
8932 xyplot->mouse_button=0;
8933 }
8934 /* draw object line */
8935 if ( !xyplot->double_click && xyplot->object_begin_point.x>-1) {
8936
8937 gdouble X1, Y1;
8938 gdouble X2, Y2;
8939 if(gabedit_xyplot_get_point(GABEDIT_XYPLOT(xyplot), event->x, event->y, &X2, &Y2)
8940 && gabedit_xyplot_get_point(GABEDIT_XYPLOT(xyplot), xyplot->object_begin_point.x, xyplot->object_begin_point.y, &X1, &Y1))
8941 {
8942 xyplot->l_key_pressed = FALSE;
8943 add_object_line(xyplot, X1, Y1, X2, Y2);
8944 }
8945 xyplot->object_begin_point.x = -1;
8946 }
8947 /* distance */
8948 if ( !xyplot->double_click && xyplot->mouse_distance_enabled &&
8949 (xyplot->mouse_button == xyplot->mouse_distance_button)){
8950
8951 xleft=xyplot->distance_rect.x-xyplot->plotting_rect.x;
8952 xright=xyplot->distance_rect.x+xyplot->distance_rect.width-xyplot->plotting_rect.x;
8953 ybottom=xyplot->plotting_rect.y+xyplot->plotting_rect.height-xyplot->distance_rect.y-xyplot->distance_rect.height;
8954 ytop=xyplot->plotting_rect.y+xyplot->plotting_rect.height-xyplot->distance_rect.y;
8955
8956 pixel2value(xyplot, xleft, ybottom, &xmin, &ymin);
8957 pixel2value(xyplot, xright, ytop, &xmax, &ymax);
8958
8959 if(xyplot->reflect_x)
8960 {
8961 gdouble a = xmin;
8962 xmin = xmax;
8963 xmax = a;
8964 }
8965 if(xyplot->reflect_y)
8966 {
8967 gdouble a = ymin;
8968 ymin = ymax;
8969 ymax = a;
8970 }
8971 {
8972 GtkWidget* dialog = NULL;
8973 gchar* tmp = g_strdup_printf("dX = %f ; dY = %f",xmax-xmin,ymax-ymin);
8974 dialog = gtk_message_dialog_new_with_markup (NULL,
8975 GTK_DIALOG_DESTROY_WITH_PARENT,
8976 GTK_MESSAGE_INFO, GTK_BUTTONS_OK,
8977 "%s",
8978 tmp);
8979 gtk_dialog_run (GTK_DIALOG (dialog));
8980 gtk_widget_destroy (dialog);
8981 g_free(tmp);
8982 }
8983
8984 /* gabedit_xyplot_set_range(xyplot, xmin, xmax, ymin, ymax);*/
8985
8986 gtk_widget_queue_draw(GTK_WIDGET(xyplot));
8987 xyplot->mouse_button=0;
8988 }
8989 else
8990 gtk_widget_queue_draw(GTK_WIDGET(xyplot));
8991
8992 if (xyplot->mouse_displace_enabled &&
8993 (event->button == xyplot->mouse_displace_button) &&
8994 (xyplot->mouse_button == xyplot->mouse_displace_button) ){
8995 xyplot->mouse_button=0;
8996 }
8997
8998 return FALSE;
8999 }
9000 /****************************************************************************************/
gabedit_xyplot_motion_notify(GtkWidget * widget,GdkEventMotion * event)9001 static gint gabedit_xyplot_motion_notify (GtkWidget *widget, GdkEventMotion *event)
9002 {
9003 GabeditXYPlot *xyplot;
9004 gint x, y;
9005 gdouble px, py, mx, my;
9006
9007 g_return_val_if_fail (widget != NULL, FALSE);
9008 g_return_val_if_fail (GABEDIT_IS_XYPLOT (widget), FALSE);
9009 g_return_val_if_fail (event != NULL, FALSE);
9010
9011 xyplot = GABEDIT_XYPLOT (widget);
9012
9013 x = event->x;
9014 y = event->y;
9015
9016 if (event->is_hint || (event->window != widget->window))
9017 gdk_window_get_pointer (widget->window, (gint *)&x, (gint *)&y, NULL);
9018
9019 if (xyplot->selected_objects_text_num>-1)
9020 {
9021 gint i = xyplot->selected_objects_text_num;
9022 XYPlotObjectText* objectText = &GABEDIT_XYPLOT(xyplot)->objectsText[i];
9023 gabedit_xyplot_get_point_control (xyplot, x, y, objectText->width, objectText->height, objectText->angle, &mx, &my);
9024 set_object_text(xyplot, objectText, mx,my, objectText->angle, objectText->str);
9025 gtk_widget_queue_draw(GTK_WIDGET(xyplot));
9026 }
9027 else if (xyplot->selected_objects_line_num>-1)
9028 {
9029 gint i = xyplot->selected_objects_line_num;
9030 gdouble x1=0, y1=0, x2=0, y2=0;
9031 XYPlotObjectLine* objectLine = &GABEDIT_XYPLOT(xyplot)->objectsLine[i];
9032 if(xyplot->selected_objects_line_type==0)
9033 {
9034 xyplot->object_end_point.x=x;
9035 xyplot->object_end_point.y=y;
9036 gabedit_xyplot_get_point_control (xyplot, xyplot->object_begin_point.x, xyplot->object_begin_point.y,
9037 objectLine->width,objectLine->width, 0, &x1, &y1);
9038 gabedit_xyplot_get_point_control (xyplot, xyplot->object_end_point.x, xyplot->object_end_point.y,
9039 objectLine->width,objectLine->width, 0, &x2, &y2);
9040 }
9041 else if(xyplot->selected_objects_line_type==1)
9042 {
9043 xyplot->object_begin_point.x=x;
9044 xyplot->object_begin_point.y=y;
9045 gabedit_xyplot_get_point_control (xyplot, xyplot->object_begin_point.x, xyplot->object_begin_point.y,
9046 objectLine->width,objectLine->width, 0, &x1, &y1);
9047 gabedit_xyplot_get_point_control (xyplot, xyplot->object_end_point.x, xyplot->object_end_point.y,
9048 objectLine->width,objectLine->width, 0, &x2, &y2);
9049 }
9050 set_object_line(xyplot, objectLine,
9051 x1, y1,
9052 x2, y2,
9053 objectLine->width,
9054 objectLine->arrow_size,
9055 objectLine->color,
9056 objectLine->style
9057 );
9058 gtk_widget_queue_draw(GTK_WIDGET(xyplot));
9059 }
9060 else if (xyplot->selected_objects_image_num>-1)
9061 {
9062 gint i = xyplot->selected_objects_image_num;
9063 XYPlotObjectImage* objectImage = &GABEDIT_XYPLOT(xyplot)->objectsImage[i];
9064 if(xyplot->object_begin_point.x>0)
9065 {
9066 gint dx,dy;
9067 x -= xyplot->object_begin_point.x;
9068 y -= xyplot->object_begin_point.y;
9069 if(x<0) x = 0;
9070 if(y<0) y = 0;
9071 dx = x+objectImage->widthi-widget->allocation.width;
9072 if(dx>0) x-=dx;
9073 dy = y+objectImage->heighti-widget->allocation.height;
9074 if(dy>0) y-=dy;
9075 set_object_image(xyplot, objectImage, x, y, objectImage->widthi, objectImage->heighti);
9076 }
9077 if(xyplot->object_end_point.x>0)
9078 {
9079 gint w,h;
9080 x += xyplot->object_end_point.x;
9081 y += xyplot->object_end_point.y;
9082 if(x<objectImage->xi) x = objectImage->xi+20;
9083 if(y<objectImage->yi) y = objectImage->yi+20;
9084 if(x>widget->allocation.width) x = widget->allocation.width;
9085 if(y>widget->allocation.height) y = widget->allocation.height;
9086 w = (gint)(x-objectImage->xi);
9087 h = (gint)(y-objectImage->yi);
9088 set_object_image(xyplot, objectImage, objectImage->xi, objectImage->yi, w, h);
9089 }
9090
9091 gtk_widget_queue_draw(GTK_WIDGET(xyplot));
9092 }
9093 else if (xyplot->object_begin_point.x>-1)
9094 {
9095 xyplot->object_end_point.x=x;
9096 xyplot->object_end_point.y=y;
9097 gtk_widget_queue_draw(GTK_WIDGET(xyplot));
9098 }
9099
9100 /* Zoom */
9101 if (xyplot->mouse_zoom_enabled &&
9102 (xyplot->mouse_button == xyplot->mouse_zoom_button) ){
9103 if (x < xyplot->plotting_rect.x)
9104 x=xyplot->plotting_rect.x;
9105
9106 if(x > (xyplot->plotting_rect.x + xyplot->plotting_rect.width))
9107 x=(xyplot->plotting_rect.x + xyplot->plotting_rect.width);
9108
9109 if (y < xyplot->plotting_rect.y)
9110 y=xyplot->plotting_rect.y;
9111
9112 if (y > (xyplot->plotting_rect.y + xyplot->plotting_rect.height))
9113 y=(xyplot->plotting_rect.y + xyplot->plotting_rect.height);
9114
9115 if (xyplot->zoom_point.x < x){
9116 xyplot->zoom_rect.x=xyplot->zoom_point.x;
9117 xyplot->zoom_rect.width=x-xyplot->zoom_point.x;
9118 }else{
9119 xyplot->zoom_rect.x=x;
9120 xyplot->zoom_rect.width=xyplot->zoom_point.x-x;
9121 }
9122
9123 if (xyplot->zoom_point.y < y){
9124 xyplot->zoom_rect.y=xyplot->zoom_point.y;
9125 xyplot->zoom_rect.height=y-xyplot->zoom_point.y;
9126 }else{
9127 xyplot->zoom_rect.y=y;
9128 xyplot->zoom_rect.height=xyplot->zoom_point.y-y;
9129 }
9130
9131 gtk_widget_queue_draw(GTK_WIDGET(xyplot));
9132 }
9133 /* distance between 2 points */
9134 if (xyplot->mouse_distance_enabled &&
9135 (xyplot->mouse_button == xyplot->mouse_distance_button) ){
9136 if (x < xyplot->plotting_rect.x)
9137 x=xyplot->plotting_rect.x;
9138
9139 if(x > (xyplot->plotting_rect.x + xyplot->plotting_rect.width))
9140 x=(xyplot->plotting_rect.x + xyplot->plotting_rect.width);
9141
9142 if (y < xyplot->plotting_rect.y)
9143 y=xyplot->plotting_rect.y;
9144
9145 if (y > (xyplot->plotting_rect.y + xyplot->plotting_rect.height))
9146 y=(xyplot->plotting_rect.y + xyplot->plotting_rect.height);
9147
9148 xyplot->distance_rect.x=xyplot->distance_point.x;
9149 xyplot->distance_rect.width=x-xyplot->distance_point.x;
9150
9151 xyplot->distance_rect.y=xyplot->distance_point.y;
9152 xyplot->distance_rect.height=y-xyplot->distance_point.y;
9153
9154 gtk_widget_queue_draw(GTK_WIDGET(xyplot));
9155 }
9156
9157 if (xyplot->mouse_displace_enabled && (xyplot->mouse_button==xyplot->mouse_displace_button))
9158 if ( (x > xyplot->plotting_rect.x) &&
9159 (x < (xyplot->plotting_rect.width + xyplot->plotting_rect.x)) &&
9160 (y > xyplot->plotting_rect.y) &&
9161 (y < (xyplot->plotting_rect.height + xyplot->plotting_rect.y)) ){
9162 pixel2value(xyplot, xyplot->move_point.x, xyplot->move_point.y, &px, &py);
9163 pixel2value(xyplot, x, y, &mx, &my);
9164
9165 gabedit_xyplot_set_range(xyplot, xyplot->xmin+(px-mx), xyplot->xmax+(px-mx), xyplot->ymin-(py-my), xyplot->ymax-(py-my));
9166 xyplot->move_point.x=x;
9167 xyplot->move_point.y=y;
9168 }
9169
9170 return FALSE;
9171 }
9172 /****************************************************************************************/
gabedit_xyplot_scroll(GtkWidget * widget,GdkEventScroll * event)9173 static gint gabedit_xyplot_scroll (GtkWidget *widget, GdkEventScroll *event)
9174 {
9175 GabeditXYPlot *xyplot;
9176 gdouble x_range = 0.0, y_range = 0.0,
9177 xmin = 0.0, xmax = 0.0,
9178 ymin = 0.0, ymax = 0.0;
9179
9180 g_return_val_if_fail (widget != NULL, FALSE);
9181 g_return_val_if_fail (GABEDIT_IS_XYPLOT (widget), FALSE);
9182 g_return_val_if_fail (event != NULL, FALSE);
9183
9184 xyplot=GABEDIT_XYPLOT(widget);
9185
9186 if (xyplot->wheel_zoom_enabled){
9187 if (event->direction==GDK_SCROLL_UP){
9188 x_range=xyplot->wheel_zoom_factor*(xyplot->xmax-xyplot->xmin);
9189 y_range=xyplot->wheel_zoom_factor*(xyplot->ymax-xyplot->ymin);
9190 }
9191
9192 if (event->direction==GDK_SCROLL_DOWN){
9193 x_range=(xyplot->xmax-xyplot->xmin)/xyplot->wheel_zoom_factor;
9194 y_range=(xyplot->ymax-xyplot->ymin)/xyplot->wheel_zoom_factor;
9195 }
9196
9197 xmin=xyplot->xmin+((xyplot->xmax-xyplot->xmin)/2.0)-(x_range/2.0);
9198 xmax=xyplot->xmin+((xyplot->xmax-xyplot->xmin)/2.0)+(x_range/2.0);
9199
9200 ymin=xyplot->ymin+((xyplot->ymax-xyplot->ymin)/2.0)-(y_range/2.0);
9201 ymax=xyplot->ymin+((xyplot->ymax-xyplot->ymin)/2.0)+(y_range/2.0);
9202
9203 gabedit_xyplot_set_range(xyplot, xmin, xmax, ymin, ymax);
9204 }
9205 return TRUE;
9206 }
9207 /****************************************************************************************/
gabedit_xyplot_style_set(GtkWidget * widget,GtkStyle * previous_style)9208 static void gabedit_xyplot_style_set (GtkWidget *widget, GtkStyle *previous_style)
9209 {
9210 GabeditXYPlot *xyplot;
9211
9212 g_return_if_fail (widget != NULL);
9213 g_return_if_fail (GABEDIT_IS_XYPLOT (widget));
9214
9215 xyplot = GABEDIT_XYPLOT (widget);
9216
9217 xyplot_calculate_legends_sizes(xyplot);
9218 xyplot_calculate_sizes(xyplot);
9219 gtk_widget_queue_draw(GTK_WIDGET(xyplot));
9220 }
9221 /****************************************************************************************/
gabedit_xyplot_set_range(GabeditXYPlot * xyplot,gdouble xmin,gdouble xmax,gdouble ymin,gdouble ymax)9222 void gabedit_xyplot_set_range (GabeditXYPlot *xyplot, gdouble xmin, gdouble xmax, gdouble ymin, gdouble ymax)
9223 {
9224 g_return_if_fail (xyplot != NULL);
9225 g_return_if_fail (GABEDIT_IS_XYPLOT (xyplot));
9226
9227 if (xmin < xmax){
9228 xyplot->xmin=xmin;
9229 xyplot->xmax=xmax;
9230 }
9231
9232 if (ymin < ymax){
9233 xyplot->ymin=ymin;
9234 xyplot->ymax=ymax;
9235 }
9236
9237 xyplot_free_legends(xyplot);
9238 xyplot_build_legends(xyplot);
9239 xyplot_calculate_sizes(xyplot);
9240 gtk_widget_queue_draw(GTK_WIDGET(xyplot));
9241 }
9242 /****************************************************************************************/
gabedit_xyplot_set_range_xmin(GabeditXYPlot * xyplot,gdouble xmin)9243 void gabedit_xyplot_set_range_xmin (GabeditXYPlot *xyplot, gdouble xmin)
9244 {
9245 gabedit_xyplot_set_range(xyplot, xmin, xyplot->xmax, xyplot->ymin , xyplot->ymax);
9246 }
9247 /****************************************************************************************/
gabedit_xyplot_set_range_xmax(GabeditXYPlot * xyplot,gdouble xmax)9248 void gabedit_xyplot_set_range_xmax (GabeditXYPlot *xyplot, gdouble xmax)
9249 {
9250 gabedit_xyplot_set_range(xyplot, xyplot->xmin, xmax, xyplot->ymin , xyplot->ymax);
9251 }
9252 /****************************************************************************************/
gabedit_xyplot_set_range_ymin(GabeditXYPlot * xyplot,gdouble ymin)9253 void gabedit_xyplot_set_range_ymin (GabeditXYPlot *xyplot, gdouble ymin)
9254 {
9255 gabedit_xyplot_set_range(xyplot, xyplot->xmin, xyplot->xmax, ymin , xyplot->ymax);
9256 }
9257 /****************************************************************************************/
gabedit_xyplot_set_range_ymax(GabeditXYPlot * xyplot,gdouble ymax)9258 void gabedit_xyplot_set_range_ymax (GabeditXYPlot *xyplot, gdouble ymax)
9259 {
9260 gabedit_xyplot_set_range(xyplot, xyplot->xmin, xyplot->xmax, xyplot->ymin , ymax);
9261 }
9262 /****************************************************************************************/
gabedit_xyplot_set_autorange(GabeditXYPlot * xyplot,XYPlotData * data)9263 void gabedit_xyplot_set_autorange (GabeditXYPlot *xyplot, XYPlotData *data)
9264 {
9265 gint loop, loop2;
9266 gdouble xmax, xmin, ymax, ymin;
9267 gdouble dx, dy;
9268 XYPlotData *current_data;
9269 GList *current_node;
9270
9271 g_return_if_fail (xyplot != NULL);
9272 g_return_if_fail (GABEDIT_IS_XYPLOT (xyplot));
9273
9274 xmax=1.0;
9275 xmin=-1.0;
9276 ymax=1.0;
9277 ymin=-1.0;
9278
9279 if (data!=NULL){
9280 xmax=data->x[0];
9281 xmin=data->x[0];
9282 ymax=data->y[0];
9283 ymin=data->y[0];
9284 for (loop=1; loop<data->size; loop++){
9285 if (data->x[loop] > xmax)
9286 xmax=data->x[loop];
9287 if (data->x[loop] < xmin)
9288 xmin=data->x[loop];
9289 if (data->y[loop] > ymax)
9290 ymax=data->y[loop];
9291 if (data->y[loop] < ymin)
9292 ymin=data->y[loop];
9293 }
9294 }
9295
9296 if ( (data == NULL) && xyplot->data_list ){
9297 current_node=g_list_first(xyplot->data_list);
9298 current_data=(XYPlotData*)current_node->data;
9299 xmin=current_data->x[0];
9300 xmax=current_data->x[0];
9301 ymin=current_data->y[0];
9302 ymax=current_data->y[0];
9303 for (; current_node!=NULL; current_node=current_node->next)
9304 {
9305 current_data=(XYPlotData*)current_node->data;
9306 for (loop2=0; loop2<current_data->size; loop2++){
9307 if (xmin > current_data->x[loop2])
9308 xmin=current_data->x[loop2];
9309 if (xmax < current_data->x[loop2])
9310 xmax=current_data->x[loop2];
9311 if (ymin > current_data->y[loop2])
9312 ymin=current_data->y[loop2];
9313 if (ymax < current_data->y[loop2])
9314 ymax=current_data->y[loop2];
9315 }
9316 }
9317 }
9318
9319 dx=fabs(xmax-xmin);
9320 dy=fabs(ymax-ymin);
9321 xmin=xmin-dx*0.1;
9322 xmax=xmax+dx*0.1;
9323 ymin=ymin-dy*0.1;
9324 ymax=ymax+dy*0.1;
9325
9326 xyplot->xmin=xmin;
9327 xyplot->xmax=xmax;
9328 xyplot->ymin=ymin;
9329 xyplot->ymax=ymax;
9330
9331 xyplot_free_legends(xyplot);
9332 xyplot_build_legends(xyplot);
9333 xyplot_calculate_sizes(xyplot);
9334
9335 gtk_widget_queue_draw(GTK_WIDGET(xyplot));
9336 }
9337 /****************************************************************************************/
gabedit_xyplot_get_reflects(GabeditXYPlot * xyplot,gboolean * rx,gboolean * ry)9338 void gabedit_xyplot_get_reflects (GabeditXYPlot *xyplot, gboolean* rx, gboolean* ry)
9339 {
9340 g_return_if_fail (xyplot != NULL);
9341 g_return_if_fail (GABEDIT_IS_XYPLOT (xyplot));
9342
9343 if (rx!=NULL) *rx=xyplot->reflect_x;
9344 if (ry!=NULL) *ry=xyplot->reflect_y;
9345 }
9346 /****************************************************************************************/
gabedit_xyplot_get_range(GabeditXYPlot * xyplot,gdouble * xmin,gdouble * xmax,gdouble * ymin,gdouble * ymax)9347 void gabedit_xyplot_get_range (GabeditXYPlot *xyplot, gdouble *xmin, gdouble *xmax, gdouble *ymin, gdouble *ymax)
9348 {
9349 g_return_if_fail (xyplot != NULL);
9350 g_return_if_fail (GABEDIT_IS_XYPLOT (xyplot));
9351
9352 if (xmin!=NULL)
9353 *xmin=xyplot->xmin;
9354 if (xmax!=NULL)
9355 *xmax=xyplot->xmax;
9356 if (ymax!=NULL)
9357 *ymax=xyplot->ymax;
9358 if (ymin!=NULL)
9359 *ymin=xyplot->ymin;
9360 }
9361 /****************************************************************************************/
gabedit_xyplot_get_point(GabeditXYPlot * xyplot,gint x,gint y,gdouble * xv,gdouble * yv)9362 gboolean gabedit_xyplot_get_point (GabeditXYPlot *xyplot, gint x, gint y, gdouble *xv, gdouble *yv)
9363 {
9364 g_return_val_if_fail (xyplot != NULL, FALSE);
9365 g_return_val_if_fail (GABEDIT_IS_XYPLOT (xyplot),FALSE);
9366
9367 /*
9368 if ((x < xyplot->plotting_rect.x) ||
9369 (x > (xyplot->plotting_rect.x + xyplot->plotting_rect.width)) ||
9370 (y < xyplot->plotting_rect.y) ||
9371 (y > (xyplot->plotting_rect.y + xyplot->plotting_rect.height))) {
9372 *xv=*yv=0;
9373 return FALSE;
9374 }
9375 */
9376
9377 x=x-xyplot->plotting_rect.x;
9378 y=xyplot->plotting_rect.y+xyplot->plotting_rect.height-y;
9379
9380 pixel2value(xyplot, x, y, xv, yv);
9381 return TRUE;
9382 }
9383 /****************************************************************************************/
gabedit_xyplot_get_point_control(GabeditXYPlot * xyplot,gint x,gint y,gint width,gint height,gdouble angle,gdouble * xv,gdouble * yv)9384 gboolean gabedit_xyplot_get_point_control(GabeditXYPlot *xyplot, gint x, gint y, gint width, gint height, gdouble angle, gdouble *xv, gdouble *yv )
9385 {
9386 gdouble xa, ya;
9387 gdouble xmin,xmax,ymin,ymax;
9388 gint a[4],b[4];
9389 gint i;
9390 gint ixmin,ixmax,iymin,iymax;
9391 gdouble alpha = angle;
9392 gdouble l;
9393 gint lcos;
9394 gint lsin;
9395 gint wcos;
9396 gint wsin;
9397 gint hcos;
9398 gint hsin;
9399 GtkWidget *widget = GTK_WIDGET(xyplot);
9400
9401
9402 g_return_val_if_fail (xyplot != NULL, FALSE);
9403 g_return_val_if_fail (GABEDIT_IS_XYPLOT (xyplot),FALSE);
9404 if(width>0) alpha -= atan((gdouble)height/width);
9405 l = sqrt(width*width+height*height);
9406 lcos = (gint)(l*cos(alpha));
9407 lsin = (gint)(l*sin(alpha));
9408 wcos = (gint)(width*cos(angle));
9409 wsin = (gint)(width*sin(angle));
9410 hcos = (gint)(height*cos(angle-M_PI/2));
9411 hsin = (gint)(height*sin(angle-M_PI/2));
9412
9413 ixmin = 0;
9414 if(ixmin<-lcos) ixmin = -lcos;
9415 if(ixmin<-wcos) ixmin = -wcos;
9416 if(ixmin<-hcos) ixmin = -hcos;
9417
9418 iymin = 0;
9419 if(iymin<lsin) iymin = lsin;
9420 if(iymin<wsin) iymin = wsin;
9421 if(iymin<hsin) iymin = hsin;
9422
9423 ixmax = 0;
9424 if(ixmax<lcos) ixmax = lcos;
9425 if(ixmax<wcos) ixmax = wcos;
9426 if(ixmax<hcos) ixmax = hcos;
9427 ixmax = widget->allocation.width-ixmax;
9428
9429 iymax = 0;
9430 if(iymax<-lsin) iymax = -lsin;
9431 if(iymax<-wsin) iymax = -wsin;
9432 if(iymax<-hsin) iymax = -hsin;
9433 iymax = widget->allocation.height-iymax;
9434
9435 /* printf("iminmax = %d %d %d %d\n",ixmin,ixmax,iymin,iymax);*/
9436 a[0] = ixmin;
9437 a[1] = ixmax;
9438 a[2] = ixmax;
9439 a[3] = ixmin;
9440 b[0] = iymin;
9441 b[1] = iymin;
9442 b[2] = iymax;
9443 b[3] = iymax;
9444
9445 gabedit_xyplot_get_point (xyplot, x, y, xv, yv);
9446 xmin = xmax = *xv;
9447 ymin = ymax = *yv;
9448 for(i=0;i<4;i++)
9449 {
9450 gabedit_xyplot_get_point (xyplot, a[i], b[i], &xa, &ya);
9451 if(i==0)
9452 {
9453 xmin = xa;
9454 xmax = xa;
9455 ymin = ya;
9456 ymax = ya;
9457 }
9458 else
9459 {
9460 if(xmin>xa) xmin = xa;
9461 if(ymin>ya) ymin = ya;
9462 if(xmax<xa) xmax = xa;
9463 if(ymax<ya) ymax = ya;
9464 }
9465 }
9466 /* printf("xmax ymax = %f %f\n",xmax,ymax);*/
9467
9468 if(*xv<xmin) *xv = xmin;
9469 if(*yv<ymin) *yv = ymin;
9470 if(*xv>xmax) *xv = xmax;
9471 if(*yv>ymax) *yv = ymax;
9472 return TRUE;
9473 }
9474 /****************************************************************************************/
gabedit_xyplot_set_ticks(GabeditXYPlot * xyplot,gint hmajor,gint hminor,gint vmajor,gint vminor,gint length)9475 void gabedit_xyplot_set_ticks (GabeditXYPlot *xyplot, gint hmajor, gint hminor, gint vmajor, gint vminor, gint length)
9476 {
9477 g_return_if_fail (xyplot != NULL);
9478 g_return_if_fail (GABEDIT_IS_XYPLOT (xyplot));
9479
9480 xyplot_free_legends(xyplot);
9481
9482 xyplot->hmajor_ticks=hmajor;
9483 xyplot->hminor_ticks=hminor;
9484 xyplot->vmajor_ticks=vmajor;
9485 xyplot->vminor_ticks=vminor;
9486 xyplot->length_ticks=length;
9487
9488 xyplot_build_legends(xyplot);
9489 xyplot_calculate_sizes(xyplot);
9490 gtk_widget_queue_draw(GTK_WIDGET(xyplot));
9491 }
9492 /****************************************************************************************/
gabedit_xyplot_set_ticks_hmajor(GabeditXYPlot * xyplot,gint hmajor)9493 void gabedit_xyplot_set_ticks_hmajor (GabeditXYPlot *xyplot, gint hmajor)
9494 {
9495 g_return_if_fail (xyplot != NULL);
9496 g_return_if_fail (GABEDIT_IS_XYPLOT (xyplot));
9497
9498 xyplot_free_legends(xyplot);
9499
9500 xyplot->hmajor_ticks=hmajor;
9501
9502 xyplot_build_legends(xyplot);
9503 xyplot_calculate_sizes(xyplot);
9504 gtk_widget_queue_draw(GTK_WIDGET(xyplot));
9505 }
9506 /****************************************************************************************/
gabedit_xyplot_set_ticks_hminor(GabeditXYPlot * xyplot,gint hminor)9507 void gabedit_xyplot_set_ticks_hminor (GabeditXYPlot *xyplot, gint hminor)
9508 {
9509 g_return_if_fail (xyplot != NULL);
9510 g_return_if_fail (GABEDIT_IS_XYPLOT (xyplot));
9511
9512 xyplot_free_legends(xyplot);
9513
9514 xyplot->hminor_ticks=hminor;
9515
9516 xyplot_build_legends(xyplot);
9517 xyplot_calculate_sizes(xyplot);
9518 gtk_widget_queue_draw(GTK_WIDGET(xyplot));
9519 }
9520 /****************************************************************************************/
gabedit_xyplot_set_ticks_vmajor(GabeditXYPlot * xyplot,gint vmajor)9521 void gabedit_xyplot_set_ticks_vmajor (GabeditXYPlot *xyplot, gint vmajor)
9522 {
9523 g_return_if_fail (xyplot != NULL);
9524 g_return_if_fail (GABEDIT_IS_XYPLOT (xyplot));
9525
9526 xyplot_free_legends(xyplot);
9527
9528 xyplot->vmajor_ticks=vmajor;
9529
9530 xyplot_build_legends(xyplot);
9531 xyplot_calculate_sizes(xyplot);
9532 gtk_widget_queue_draw(GTK_WIDGET(xyplot));
9533 }
9534 /****************************************************************************************/
gabedit_xyplot_set_ticks_vminor(GabeditXYPlot * xyplot,gint vminor)9535 void gabedit_xyplot_set_ticks_vminor (GabeditXYPlot *xyplot, gint vminor)
9536 {
9537 g_return_if_fail (xyplot != NULL);
9538 g_return_if_fail (GABEDIT_IS_XYPLOT (xyplot));
9539
9540 xyplot_free_legends(xyplot);
9541
9542 xyplot->vminor_ticks=vminor;
9543
9544 xyplot_build_legends(xyplot);
9545 xyplot_calculate_sizes(xyplot);
9546 gtk_widget_queue_draw(GTK_WIDGET(xyplot));
9547 }
9548 /****************************************************************************************/
gabedit_xyplot_set_ticks_length(GabeditXYPlot * xyplot,gint length)9549 void gabedit_xyplot_set_ticks_length(GabeditXYPlot *xyplot, gint length)
9550 {
9551 g_return_if_fail (xyplot != NULL);
9552 g_return_if_fail (GABEDIT_IS_XYPLOT (xyplot));
9553
9554 xyplot_free_legends(xyplot);
9555
9556 xyplot->length_ticks=length;
9557
9558 xyplot_build_legends(xyplot);
9559 xyplot_calculate_sizes(xyplot);
9560 gtk_widget_queue_draw(GTK_WIDGET(xyplot));
9561 }
9562 /****************************************************************************************/
gabedit_xyplot_get_ticks(GabeditXYPlot * xyplot,gint * hmajor,gint * hminor,gint * vmajor,gint * vminor,gint * length)9563 void gabedit_xyplot_get_ticks (GabeditXYPlot *xyplot, gint *hmajor, gint *hminor, gint *vmajor, gint *vminor, gint* length)
9564 {
9565 g_return_if_fail (xyplot != NULL);
9566 g_return_if_fail (GABEDIT_IS_XYPLOT (xyplot));
9567
9568 if (hmajor!=NULL)
9569 *hmajor=xyplot->hmajor_ticks;
9570 if (hminor!=NULL)
9571 *hminor=xyplot->hminor_ticks;
9572 if (vmajor!=NULL)
9573 *vmajor=xyplot->vmajor_ticks;
9574 if (vminor!=NULL)
9575 *vminor=xyplot->vminor_ticks;
9576 if (length!=NULL)
9577 *length=xyplot->length_ticks;
9578 }
9579 /****************************************************************************************/
gabedit_xyplot_set_margins_left(GabeditXYPlot * xyplot,gint left)9580 void gabedit_xyplot_set_margins_left (GabeditXYPlot *xyplot, gint left)
9581 {
9582 g_return_if_fail (xyplot != NULL);
9583 g_return_if_fail (GABEDIT_IS_XYPLOT (xyplot));
9584
9585 xyplot_free_legends(xyplot);
9586
9587 xyplot->left_margins=left;
9588
9589 xyplot_build_legends(xyplot);
9590 xyplot_calculate_sizes(xyplot);
9591 gtk_widget_queue_draw(GTK_WIDGET(xyplot));
9592 }
9593 /****************************************************************************************/
gabedit_xyplot_set_margins_right(GabeditXYPlot * xyplot,gint right)9594 void gabedit_xyplot_set_margins_right (GabeditXYPlot *xyplot, gint right)
9595 {
9596 g_return_if_fail (xyplot != NULL);
9597 g_return_if_fail (GABEDIT_IS_XYPLOT (xyplot));
9598
9599 xyplot_free_legends(xyplot);
9600
9601 xyplot->right_margins=right;
9602
9603 xyplot_build_legends(xyplot);
9604 xyplot_calculate_sizes(xyplot);
9605 gtk_widget_queue_draw(GTK_WIDGET(xyplot));
9606 }
9607 /****************************************************************************************/
gabedit_xyplot_set_margins_top(GabeditXYPlot * xyplot,gint top)9608 void gabedit_xyplot_set_margins_top (GabeditXYPlot *xyplot, gint top)
9609 {
9610 g_return_if_fail (xyplot != NULL);
9611 g_return_if_fail (GABEDIT_IS_XYPLOT (xyplot));
9612
9613 xyplot_free_legends(xyplot);
9614
9615 xyplot->top_margins=top;
9616
9617 xyplot_build_legends(xyplot);
9618 xyplot_calculate_sizes(xyplot);
9619 gtk_widget_queue_draw(GTK_WIDGET(xyplot));
9620 }
9621 /****************************************************************************************/
gabedit_xyplot_set_margins_bottom(GabeditXYPlot * xyplot,gint bottom)9622 void gabedit_xyplot_set_margins_bottom (GabeditXYPlot *xyplot, gint bottom)
9623 {
9624 g_return_if_fail (xyplot != NULL);
9625 g_return_if_fail (GABEDIT_IS_XYPLOT (xyplot));
9626
9627 xyplot_free_legends(xyplot);
9628
9629 xyplot->bottom_margins=bottom;
9630
9631 xyplot_build_legends(xyplot);
9632 xyplot_calculate_sizes(xyplot);
9633 gtk_widget_queue_draw(GTK_WIDGET(xyplot));
9634 }
9635 /****************************************************************************************/
gabedit_xyplot_set_x_legends_digits(GabeditXYPlot * xyplot,gint digits)9636 void gabedit_xyplot_set_x_legends_digits (GabeditXYPlot *xyplot, gint digits)
9637 {
9638 g_return_if_fail (xyplot != NULL);
9639 g_return_if_fail (GABEDIT_IS_XYPLOT (xyplot));
9640
9641 if (digits != xyplot->x_legends_digits){
9642 xyplot_free_legends(xyplot);
9643
9644 xyplot->x_legends_digits=digits;
9645
9646 xyplot_build_legends(xyplot);
9647 xyplot_calculate_legends_sizes(xyplot);
9648 xyplot_calculate_sizes(xyplot);
9649 gtk_widget_queue_draw(GTK_WIDGET(xyplot));
9650 }
9651 }
9652 /****************************************************************************************/
gabedit_xyplot_set_y_legends_digits(GabeditXYPlot * xyplot,gint digits)9653 void gabedit_xyplot_set_y_legends_digits (GabeditXYPlot *xyplot, gint digits)
9654 {
9655 g_return_if_fail (xyplot != NULL);
9656 g_return_if_fail (GABEDIT_IS_XYPLOT (xyplot));
9657
9658 if (digits != xyplot->y_legends_digits){
9659 xyplot_free_legends(xyplot);
9660
9661 xyplot->y_legends_digits=digits;
9662
9663 xyplot_build_legends(xyplot);
9664 xyplot_calculate_legends_sizes(xyplot);
9665 xyplot_calculate_sizes(xyplot);
9666 gtk_widget_queue_draw(GTK_WIDGET(xyplot));
9667 }
9668 }
9669 /****************************************************************************************/
gabedit_xyplot_get_x_legends_digits(GabeditXYPlot * xyplot)9670 gint gabedit_xyplot_get_x_legends_digits (GabeditXYPlot *xyplot)
9671 {
9672 g_return_val_if_fail (xyplot != NULL, 0);
9673 g_return_val_if_fail (GABEDIT_IS_XYPLOT (xyplot), 0);
9674
9675 return(xyplot->x_legends_digits);
9676 }
9677 /****************************************************************************************/
gabedit_xyplot_get_y_legends_digits(GabeditXYPlot * xyplot)9678 gint gabedit_xyplot_get_y_legends_digits (GabeditXYPlot *xyplot)
9679 {
9680 g_return_val_if_fail (xyplot != NULL, 0);
9681 g_return_val_if_fail (GABEDIT_IS_XYPLOT (xyplot), 0);
9682
9683 return(xyplot->y_legends_digits);
9684 }
9685 /****************************************************************************************/
gabedit_xyplot_set_background_color(GabeditXYPlot * xyplot,GdkColor color)9686 void gabedit_xyplot_set_background_color (GabeditXYPlot *xyplot, GdkColor color)
9687 {
9688 g_return_if_fail (xyplot != NULL);
9689 g_return_if_fail (GABEDIT_IS_XYPLOT (xyplot));
9690
9691 gdk_gc_set_rgb_fg_color(xyplot->back_gc, &color);
9692
9693 gtk_widget_queue_draw(GTK_WIDGET(xyplot));
9694 }
9695 /****************************************************************************************/
gabedit_xyplot_set_grids_attributes(GabeditXYPlot * xyplot,GabeditXYPlotGrid grid,GdkColor color,gint line_width,GdkLineStyle line_style)9696 void gabedit_xyplot_set_grids_attributes (GabeditXYPlot *xyplot,
9697 GabeditXYPlotGrid grid,
9698 GdkColor color,
9699 gint line_width,
9700 GdkLineStyle line_style)
9701 {
9702 GdkGC *gc;
9703
9704 g_return_if_fail (xyplot != NULL);
9705 g_return_if_fail (GABEDIT_IS_XYPLOT (xyplot));
9706
9707 switch (grid){
9708 case GABEDIT_XYPLOT_HMAJOR_GRID:
9709 gc=xyplot->hmajor_grid_gc;
9710 break;
9711 case GABEDIT_XYPLOT_HMINOR_GRID:
9712 gc=xyplot->hminor_grid_gc;
9713 break;
9714 case GABEDIT_XYPLOT_VMAJOR_GRID:
9715 gc=xyplot->vmajor_grid_gc;
9716 break;
9717 case GABEDIT_XYPLOT_VMINOR_GRID:
9718 gc=xyplot->vminor_grid_gc;
9719 break;
9720 default:
9721 return;
9722 }
9723
9724 gdk_gc_set_rgb_fg_color(gc, &color);
9725 gdk_gc_set_line_attributes(gc, line_width, line_style, 0 ,0);
9726
9727 gtk_widget_queue_draw(GTK_WIDGET(xyplot));
9728 }
9729 /****************************************************************************************/
gabedit_xyplot_get_grids_attributes(GabeditXYPlot * xyplot,GabeditXYPlotGrid grid,GdkColor * color,gint * line_width,GdkLineStyle * line_style)9730 void gabedit_xyplot_get_grids_attributes (GabeditXYPlot *xyplot,
9731 GabeditXYPlotGrid grid,
9732 GdkColor *color,
9733 gint *line_width,
9734 GdkLineStyle *line_style)
9735 {
9736 GdkGC *gc;
9737 GdkGCValues gc_values;
9738
9739 g_return_if_fail (xyplot != NULL);
9740 g_return_if_fail (GABEDIT_IS_XYPLOT (xyplot));
9741 g_return_if_fail (color != NULL);
9742 g_return_if_fail (line_width != NULL);
9743 g_return_if_fail (line_style != NULL);
9744
9745 switch (grid){
9746 case GABEDIT_XYPLOT_HMAJOR_GRID:
9747 gc=xyplot->hmajor_grid_gc;
9748 break;
9749 case GABEDIT_XYPLOT_HMINOR_GRID:
9750 gc=xyplot->hminor_grid_gc;
9751 break;
9752 case GABEDIT_XYPLOT_VMAJOR_GRID:
9753 gc=xyplot->vmajor_grid_gc;
9754 break;
9755 case GABEDIT_XYPLOT_VMINOR_GRID:
9756 gc=xyplot->vminor_grid_gc;
9757 break;
9758 default:
9759 return;
9760 }
9761
9762 gdk_gc_get_values(gc, &gc_values);
9763
9764 *color=gc_values.foreground;
9765 *line_width=gc_values.line_width;
9766 *line_style=gc_values.line_style;
9767 }
9768 /****************************************************************************************/
xyplot_enable_grids(GabeditXYPlot * xyplot,GabeditXYPlotGrid grid,gboolean enable)9769 static void xyplot_enable_grids (GabeditXYPlot *xyplot, GabeditXYPlotGrid grid, gboolean enable)
9770 {
9771 g_return_if_fail (xyplot != NULL);
9772 g_return_if_fail (GABEDIT_IS_XYPLOT (xyplot));
9773
9774 switch (grid){
9775 case GABEDIT_XYPLOT_HMAJOR_GRID:
9776 xyplot->hmajor_grid=enable;
9777 break;
9778 case GABEDIT_XYPLOT_HMINOR_GRID:
9779 xyplot->hminor_grid=enable;
9780 break;
9781 case GABEDIT_XYPLOT_VMAJOR_GRID:
9782 xyplot->vmajor_grid=enable;
9783 break;
9784 case GABEDIT_XYPLOT_VMINOR_GRID:
9785 xyplot->vminor_grid=enable;
9786 break;
9787 default:
9788 return;
9789 }
9790
9791 xyplot_calculate_sizes(xyplot);
9792 gtk_widget_queue_draw(GTK_WIDGET(xyplot));
9793 }
9794 /****************************************************************************************/
gabedit_xyplot_enable_grids(GabeditXYPlot * xyplot,GabeditXYPlotGrid grid,gboolean enable)9795 void gabedit_xyplot_enable_grids (GabeditXYPlot *xyplot, GabeditXYPlotGrid grid, gboolean enable)
9796 {
9797
9798 GtkUIManager *manager = g_object_get_data(G_OBJECT (xyplot), "Manager");
9799 GtkAction* action = NULL;
9800 if(!manager) return;
9801 if(grid==GABEDIT_XYPLOT_HMAJOR_GRID)
9802 action = gtk_ui_manager_get_action (manager, "/MenuXYPlot/Render/RenderGrid/HGridShowMajor");
9803 if(grid==GABEDIT_XYPLOT_HMINOR_GRID)
9804 action = gtk_ui_manager_get_action (manager, "/MenuXYPlot/Render/RenderGrid/HGridShowMinor");
9805 if(grid==GABEDIT_XYPLOT_VMAJOR_GRID)
9806 action = gtk_ui_manager_get_action (manager, "/MenuXYPlot/Render/RenderGrid/VGridShowMajor");
9807 if(grid==GABEDIT_XYPLOT_VMINOR_GRID)
9808 action = gtk_ui_manager_get_action (manager, "/MenuXYPlot/Render/RenderGrid/VGridShowMinor");
9809 if(action) gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(action),enable);
9810 }
9811 /****************************************************************************************/
gabedit_xyplot_add_data(GabeditXYPlot * xyplot,XYPlotData * data)9812 void gabedit_xyplot_add_data(GabeditXYPlot *xyplot, XYPlotData *data)
9813 {
9814 g_return_if_fail (xyplot != NULL);
9815 g_return_if_fail (GABEDIT_IS_XYPLOT (xyplot));
9816 g_return_if_fail (data != NULL);
9817
9818 if (g_list_find (xyplot->data_list, (gpointer)data)==NULL)
9819 {
9820 xyplot->data_list=g_list_append(xyplot->data_list, (gpointer) data);
9821 data->point_pango = NULL;
9822 xyplot_build_points_data(GABEDIT_XYPLOT(xyplot), data);
9823 }
9824 }
9825 /****************************************************************************************/
gabedit_xyplot_remove_data(GabeditXYPlot * xyplot,XYPlotData * data)9826 void gabedit_xyplot_remove_data(GabeditXYPlot *xyplot, XYPlotData *data)
9827 {
9828 g_return_if_fail (xyplot != NULL);
9829 g_return_if_fail (GABEDIT_IS_XYPLOT (xyplot));
9830 g_return_if_fail (data != NULL);
9831
9832 if (g_list_find (xyplot->data_list, (gpointer)data)!=NULL){
9833 xyplot->data_list=g_list_remove_all (xyplot->data_list, (gpointer) data);
9834 }
9835 }
9836
9837 /****************************************************************************************/
gabedit_xyplot_configure_mouse_zoom(GabeditXYPlot * xyplot,gboolean enabled,gint button)9838 void gabedit_xyplot_configure_mouse_zoom(GabeditXYPlot *xyplot, gboolean enabled, gint button)
9839 {
9840 g_return_if_fail (xyplot != NULL);
9841 g_return_if_fail (GABEDIT_IS_XYPLOT (xyplot));
9842
9843 xyplot->mouse_zoom_enabled=enabled;
9844 xyplot->mouse_zoom_button=button;
9845 }
9846 /****************************************************************************************/
gabedit_xyplot_configure_mouse_distance(GabeditXYPlot * xyplot,gboolean enabled,gint button)9847 void gabedit_xyplot_configure_mouse_distance(GabeditXYPlot *xyplot, gboolean enabled, gint button)
9848 {
9849 g_return_if_fail (xyplot != NULL);
9850 g_return_if_fail (GABEDIT_IS_XYPLOT (xyplot));
9851
9852 xyplot->mouse_distance_enabled=enabled;
9853 xyplot->mouse_distance_button=button;
9854 }
9855 /****************************************************************************************/
gabedit_xyplot_configure_wheel_zoom(GabeditXYPlot * xyplot,gboolean enabled,gdouble factor)9856 void gabedit_xyplot_configure_wheel_zoom(GabeditXYPlot *xyplot, gboolean enabled, gdouble factor)
9857 {
9858 g_return_if_fail (xyplot != NULL);
9859 g_return_if_fail (GABEDIT_IS_XYPLOT (xyplot));
9860
9861 xyplot->wheel_zoom_enabled=enabled;
9862 xyplot->wheel_zoom_factor=factor;
9863 }
9864 /****************************************************************************************/
gabedit_xyplot_configure_mouse_displace(GabeditXYPlot * xyplot,gboolean enabled,gint button)9865 void gabedit_xyplot_configure_mouse_displace(GabeditXYPlot *xyplot, gboolean enabled, gint button)
9866 {
9867 g_return_if_fail (xyplot != NULL);
9868 g_return_if_fail (GABEDIT_IS_XYPLOT (xyplot));
9869
9870 xyplot->mouse_displace_enabled=enabled;
9871 xyplot->mouse_displace_button=button;
9872 }
9873 /****************************************************************************************/
gabedit_xyplot_configure_mouse_autorange(GabeditXYPlot * xyplot,gboolean enabled,gint button)9874 void gabedit_xyplot_configure_mouse_autorange(GabeditXYPlot *xyplot, gboolean enabled, gint button)
9875 {
9876 g_return_if_fail (xyplot != NULL);
9877 g_return_if_fail (GABEDIT_IS_XYPLOT (xyplot));
9878
9879 xyplot->mouse_autorange_enabled=enabled;
9880 xyplot->mouse_autorange_button=button;
9881 }
9882 /********************************************************************************/
get_rgb_image(GtkWidget * drawable)9883 static guchar *get_rgb_image(GtkWidget* drawable)
9884 {
9885 gdouble fac=255.0/65535.0;
9886 GdkColormap *colormap;
9887 gint height;
9888 gint width;
9889 gint32 pixel;
9890 GdkImage* image = NULL;
9891 GdkVisual *v;
9892 gint8 component;
9893 gint k=0;
9894 gint x;
9895 gint y;
9896 gint i;
9897 guchar* rgbbuf=NULL;
9898
9899
9900 colormap = gdk_window_get_colormap(GTK_WIDGET(drawable)->window);
9901 height = drawable->allocation.height;
9902 width = drawable->allocation.width;
9903 rgbbuf=(guchar *) g_malloc(3*width*height*sizeof(guchar));
9904
9905 if(!colormap) return NULL;
9906 if(!rgbbuf) return NULL;
9907
9908 image = gdk_image_get(drawable->window,0,0,width,height);
9909
9910 v = gdk_colormap_get_visual(colormap);
9911
9912 switch(v->type)
9913 {
9914 case GDK_VISUAL_STATIC_GRAY:
9915 case GDK_VISUAL_GRAYSCALE:
9916 case GDK_VISUAL_STATIC_COLOR:
9917 case GDK_VISUAL_PSEUDO_COLOR:
9918 for(y=height-1;y>=0;y--)
9919 for(x=0;x<(gint)width;x++)
9920 {
9921 pixel = gdk_image_get_pixel(image, x, y);
9922 rgbbuf[k] = (guchar)(colormap->colors[pixel].red*fac);
9923 rgbbuf[k+1] =(guchar) (colormap->colors[pixel].green*fac);
9924 rgbbuf[k+2] =(guchar) (colormap->colors[pixel].blue*fac);
9925 k+=3;
9926 }
9927 break;
9928
9929 case GDK_VISUAL_TRUE_COLOR:
9930 for(y=height-1;y>=0;y--)
9931 for(x=0;x<(gint)width;x++)
9932 {
9933 pixel = gdk_image_get_pixel(image, x, y);
9934 component = 0;
9935 for (i = 24; i < 32; i += v->red_prec)
9936 component |= ((pixel & v->red_mask) << (32 - v->red_shift - v->red_prec)) >> i;
9937 rgbbuf[k] = (guchar)(component);
9938
9939 component = 0;
9940 for (i = 24; i < 32; i += v->green_prec)
9941 component |= ((pixel & v->green_mask) << (32 - v->green_shift - v->green_prec)) >> i;
9942 rgbbuf[k+1] = (guchar)(component);
9943 component = 0;
9944 for (i = 24; i < 32; i += v->blue_prec)
9945 component |= ((pixel & v->blue_mask) << (32 - v->blue_shift - v->blue_prec)) >> i;
9946 rgbbuf[k+2] = (guchar)(component);
9947 k += 3;
9948 }
9949 break;
9950 case GDK_VISUAL_DIRECT_COLOR:
9951 for(y=height-1;y>=0;y--)
9952 for(x=0;x<(gint)width;x++)
9953 {
9954 pixel = gdk_image_get_pixel(image, x, y);
9955 component = colormap->colors[((pixel & v->red_mask) << (32 - v->red_shift - v->red_prec)) >> 24].red;
9956 rgbbuf[k] = (guchar)(component*fac);
9957
9958 component = colormap->colors[((pixel & v->green_mask) << (32 - v->green_shift - v->green_prec)) >> 24].green;
9959 rgbbuf[k+1] = (guchar)(component*fac);
9960 component = colormap->colors[((pixel & v->blue_mask) << (32 - v->blue_shift - v->blue_prec)) >> 24].blue;
9961 rgbbuf[k+2] = (guchar)(component*fac);
9962 k += 3;
9963 }
9964 break;
9965 default :
9966 {
9967 g_free(rgbbuf);
9968 return NULL;
9969 }
9970 }
9971 return rgbbuf;
9972 }
9973 /********************************************************************************/
WLSBL(int val,char * arr)9974 static void WLSBL(int val,char* arr)
9975 {
9976 arr[0] = (char) (val&0xff);
9977 arr[1] = (char) ((val>>8) &0xff);
9978 arr[2] = (char) ((val>>16)&0xff);
9979 arr[3] = (char) ((val>>24)&0xff);
9980 }
9981 /**************************************************************************/
writeBMP(GabeditXYPlot * xyplot,gchar * fileName)9982 static void writeBMP(GabeditXYPlot *xyplot, gchar *fileName)
9983 {
9984 guchar rgbtmp[3];
9985 int pad;
9986 char bmp_header[]=
9987 { 'B','M', 0,0,0,0, 0,0, 0,0, 54,0,0,0,
9988 40,0,0,0, 0,0,0,0, 0,0,0,0, 1,0, 24,0, 0,0,0,0, 0,0,0,0,
9989 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0 };
9990 GtkWidget *drawable;
9991
9992 FILE *file;
9993 int i;
9994 int j;
9995 int width;
9996 int height;
9997 guchar *rgbbuf;
9998
9999 file = fopen(fileName,"wb");
10000
10001 if (!file) return;
10002
10003 drawable = GTK_WIDGET(xyplot);
10004
10005 rgbbuf = get_rgb_image(drawable);
10006 if (!rgbbuf) {
10007 fclose(file);
10008 return;
10009 }
10010 width = drawable->allocation.width;
10011 height = drawable->allocation.height;
10012
10013
10014 /* The number of bytes on a screenline should be wholly devisible by 4 */
10015
10016 pad = (width*3)%4;
10017 if (pad) pad = 4 - pad;
10018
10019 WLSBL((int) (3*width+pad)*height+54,bmp_header+2);
10020 WLSBL((int) width,bmp_header+18);
10021 WLSBL((int) height,bmp_header+22);
10022 WLSBL((int) 3*width*height,bmp_header+34);
10023
10024 {int it = fwrite(bmp_header,1,54,file);}
10025
10026 for (i=0;i<height;i++)
10027 {
10028 for (j=0;j<width;j++)
10029 {
10030 rgbtmp[0] = rgbbuf[(j+width*i)*3+2];
10031 rgbtmp[1] = rgbbuf[(j+width*i)*3+1];
10032 rgbtmp[2] = rgbbuf[(j+width*i)*3+0];
10033 {int it = fwrite(rgbtmp,3,1,file);}
10034 }
10035 rgbtmp[0] = (char) 0;
10036 for (j=0;j<pad;j++)
10037 {int it = fwrite(rgbtmp,1,1,file);}
10038 }
10039
10040 fclose(file);
10041 g_free(rgbbuf);
10042 }
10043 /****************************************************************************************/
writeTransparentPNG(GabeditXYPlot * xyplot,gchar * fileName)10044 static void writeTransparentPNG(GabeditXYPlot *xyplot, gchar *fileName)
10045 {
10046 GtkWidget* widget = GTK_WIDGET(xyplot);
10047 int width;
10048 int height;
10049 GError *error = NULL;
10050 GdkPixbuf *pixbuf = NULL;
10051 width = widget->allocation.width;
10052 height = widget->allocation.height;
10053 pixbuf = gdk_pixbuf_get_from_drawable(NULL, widget->window, NULL, 0, 0, 0, 0, width, height);
10054 if(pixbuf)
10055 {
10056 GdkPixbuf *pixbufNew = NULL;
10057 guchar color[3] = {255, 255, 255};
10058 GdkColor c;
10059 GdkGCValues gc_values;
10060
10061 GdkColormap *colormap;
10062 colormap = gdk_window_get_colormap(widget->window);
10063 gdk_gc_get_values(xyplot->back_gc, &gc_values);
10064 gdk_colormap_query_color(colormap, gc_values.foreground.pixel,&c);
10065
10066 color[0] = (guchar)(SCALE(c.red)*255);
10067 color[1] = (guchar)(SCALE(c.green)*255);
10068 color[2] = (guchar)(SCALE(c.blue)*255);
10069
10070 pixbufNew = gdk_pixbuf_add_alpha(pixbuf, TRUE, color[0], color[1], color[2]);
10071 if(pixbufNew) gdk_pixbuf_save(pixbufNew, fileName, "png", &error, NULL);
10072 else gdk_pixbuf_save(pixbuf, fileName, "png", &error, NULL);
10073 g_object_unref (pixbuf);
10074 g_object_unref (pixbufNew);
10075 }
10076 }
10077 /****************************************************************************************/
gabedit_xyplot_save_image(GabeditXYPlot * xyplot,gchar * fileName,gchar * type)10078 void gabedit_xyplot_save_image(GabeditXYPlot *xyplot, gchar *fileName, gchar* type)
10079 {
10080 GtkWidget* widget = GTK_WIDGET(xyplot);
10081 int width;
10082 int height;
10083 GError *error = NULL;
10084 GdkPixbuf *pixbuf = NULL;
10085
10086 if(fileName && type && !strcmp(type,"bmp"))
10087 {
10088 writeBMP(xyplot, fileName);
10089 return;
10090 }
10091 if(fileName && type && !strcmp(type,"tpng"))
10092 {
10093 writeTransparentPNG(xyplot, fileName);
10094 return;
10095 }
10096
10097 width = widget->allocation.width;
10098 height = widget->allocation.height;
10099 pixbuf = gdk_pixbuf_get_from_drawable(NULL, widget->window, NULL, 0, 0, 0, 0, width, height);
10100 if(pixbuf)
10101 {
10102 if(!fileName)
10103 {
10104 GtkClipboard * clipboard;
10105 clipboard = gtk_clipboard_get(GDK_SELECTION_CLIPBOARD);
10106 if(clipboard)
10107 {
10108 gtk_clipboard_clear(clipboard);
10109 gtk_clipboard_set_image(clipboard, pixbuf);
10110 }
10111 }
10112 else
10113 {
10114 if(type && strstr(type,"j") && strstr(type,"g") )
10115 gdk_pixbuf_save(pixbuf, fileName, type, &error, "quality", "100", NULL);
10116 else if(type && strstr(type,"png"))
10117 gdk_pixbuf_save(pixbuf, fileName, type, &error, "compression", "5", NULL);
10118 else if(type && (strstr(type,"tif") || strstr(type,"tiff")))
10119 gdk_pixbuf_save(pixbuf, fileName, "tiff", &error, "compression", "1", NULL);
10120 else
10121 gdk_pixbuf_save(pixbuf, fileName, type, &error, NULL);
10122 }
10123 g_object_unref (pixbuf);
10124 }
10125 }
10126 /****************************************************************************************/
xyplot_calculate_sizes(GabeditXYPlot * xyplot)10127 static void xyplot_calculate_sizes (GabeditXYPlot *xyplot)
10128 {
10129 GtkWidget *widget;
10130 gint left = 10;
10131 gint right = 10;
10132 gint top = 5;
10133 gint bottom = 5;
10134
10135 g_return_if_fail (xyplot != NULL);
10136 g_return_if_fail (GABEDIT_IS_XYPLOT (xyplot));
10137
10138 widget = GTK_WIDGET(xyplot);
10139 left += 0.75*((gdouble)xyplot->y_legends_width);
10140 right += 0.75*((gdouble)xyplot->y_legends_width);
10141 top += 0.5*((gdouble)xyplot->x_legends_height);
10142 bottom += 0.5*((gdouble)xyplot->x_legends_height);
10143 if(xyplot->show_left_legends) left = xyplot->length_ticks*4+1.5*((gdouble)xyplot->y_legends_width)+1.0*((gdouble)xyplot->v_label_height);
10144 if(xyplot->show_right_legends) right = xyplot->length_ticks*4+1.5*((gdouble)xyplot->y_legends_width)+1.0*((gdouble)xyplot->v_label_height);
10145 if(xyplot->show_top_legends) top = xyplot->length_ticks*2+1.5*((gdouble)xyplot->x_legends_height)+1.0*((gdouble)xyplot->h_label_height);
10146 if(xyplot->show_bottom_legends) bottom = xyplot->length_ticks*2+1.5*((gdouble)xyplot->x_legends_height)+1.0*((gdouble)xyplot->h_label_height);
10147
10148 left += (gint)(xyplot->left_margins/100.0*widget->allocation.width);
10149 right += (gint)(xyplot->right_margins/100.0*widget->allocation.width);
10150 top += (gint)(xyplot->top_margins/100.0*widget->allocation.height);
10151 bottom += (gint)(xyplot->bottom_margins/100.0*widget->allocation.height);
10152
10153 xyplot->plotting_rect.x = left;
10154 xyplot->plotting_rect.y = top;
10155
10156
10157 xyplot->plotting_rect.width=widget->allocation.width -left - right;
10158
10159 xyplot->plotting_rect.height=widget->allocation.height - top - bottom ;
10160
10161 if (xyplot->hmajor_ticks>1){
10162 xyplot->d_hmajor=((gdouble)xyplot->plotting_rect.width)/((gdouble)xyplot->hmajor_ticks-1.0);
10163 xyplot->d_hminor=((gdouble)xyplot->d_hmajor)/((gdouble)xyplot->hminor_ticks+1.0);
10164 }
10165
10166 if (xyplot->vmajor_ticks>1){
10167 xyplot->d_vmajor=((gdouble)xyplot->plotting_rect.height)/((gdouble)xyplot->vmajor_ticks-1.0);
10168 xyplot->d_vminor=((gdouble)xyplot->d_vmajor)/((gdouble)xyplot->vminor_ticks+1.0);
10169 }
10170
10171 /* Creating the plotting area (everytime the plotting area's size is changed, the size of the pismap
10172 must be changed too, so, a new one, with the right size is created*/
10173 if (xyplot->plotting_area!=NULL) g_object_unref(G_OBJECT(xyplot->plotting_area));
10174 if (xyplot->cairo_widget!=NULL) cairo_destroy (xyplot->cairo_widget);
10175 if (xyplot->cairo_area!=NULL) cairo_destroy (xyplot->cairo_area);
10176
10177 if (GTK_WIDGET_REALIZED(widget))
10178 {
10179 xyplot->plotting_area=gdk_pixmap_new(widget->window, xyplot->plotting_rect.width, xyplot->plotting_rect.height, -1);
10180 xyplot->cairo_area = gdk_cairo_create (xyplot->plotting_area);
10181 xyplot->cairo_widget = gdk_cairo_create (widget->window);
10182 }
10183 reset_object_text_pixels(xyplot);
10184 reset_object_line_pixels(xyplot);
10185 reset_object_image_pixels(xyplot);
10186 }
10187 /****************************************************************************************/
value2pixel(GabeditXYPlot * xyplot,gdouble xv,gdouble yv,gint * x,gint * y)10188 static void value2pixel(GabeditXYPlot *xyplot, gdouble xv, gdouble yv, gint *x, gint *y)
10189 {
10190 g_return_if_fail (xyplot != NULL);
10191 g_return_if_fail (GABEDIT_IS_XYPLOT (xyplot));
10192
10193 *x=(xv-xyplot->xmin)*((gdouble)xyplot->plotting_rect.width)/(xyplot->xmax-xyplot->xmin);
10194 if(xyplot->reflect_x) *x = xyplot->plotting_rect.width - *x;
10195
10196 *y=(yv-xyplot->ymin)*((gdouble)xyplot->plotting_rect.height)/(xyplot->ymax-xyplot->ymin);
10197 if(xyplot->reflect_y) *y = xyplot->plotting_rect.height - *y;
10198 }
10199 /****************************************************************************************/
pixel2value(GabeditXYPlot * xyplot,gint xp,gint yp,gdouble * x,gdouble * y)10200 static void pixel2value(GabeditXYPlot *xyplot, gint xp, gint yp, gdouble *x, gdouble *y)
10201 {
10202 g_return_if_fail (xyplot != NULL);
10203 g_return_if_fail (GABEDIT_IS_XYPLOT (xyplot));
10204 gdouble xxp = (gdouble)xp;
10205 gdouble yyp = (gdouble)yp;
10206 if(xyplot->reflect_x) xxp = xyplot->plotting_rect.width-xxp;
10207 if(xyplot->reflect_y) yyp = xyplot->plotting_rect.height-yyp;
10208
10209
10210 *x=xyplot->xmin+((gdouble)xxp)*(xyplot->xmax-xyplot->xmin)/((gdouble)xyplot->plotting_rect.width);
10211 *y=xyplot->ymin+((gdouble)yyp)*(xyplot->ymax-xyplot->ymin)/((gdouble)xyplot->plotting_rect.height);
10212 }
10213 /****************************************************************************************/
xyplot_calculate_legends_sizes(GabeditXYPlot * xyplot)10214 static void xyplot_calculate_legends_sizes(GabeditXYPlot *xyplot)
10215 {
10216 GtkWidget *widget;
10217
10218 g_return_if_fail (xyplot != NULL);
10219
10220 widget=GTK_WIDGET(xyplot);
10221
10222 if (xyplot->x_legends_digits==0 && xyplot->y_legends_digits==0){
10223 xyplot->x_legends_width=0;
10224 xyplot->x_legends_height=0;
10225 xyplot->y_legends_width=0;
10226 xyplot->y_legends_height=0;
10227 return;
10228 }
10229
10230 if (xyplot->h_legends)
10231 {
10232 pango_layout_set_font_description (xyplot->h_legends[0], widget->style->font_desc);
10233 pango_layout_get_size(xyplot->h_legends[0], &(xyplot->x_legends_width), &(xyplot->x_legends_height));
10234 }
10235 if (xyplot->v_legends)
10236 {
10237 gint i;
10238 pango_layout_set_font_description (xyplot->v_legends[0], widget->style->font_desc);
10239 pango_layout_get_size(xyplot->v_legends[0], &(xyplot->y_legends_width), &(xyplot->y_legends_height));
10240 for (i=1; i<xyplot->vmajor_ticks; i++)
10241 {
10242 gint w,h;
10243 pango_layout_set_font_description (xyplot->v_legends[i], widget->style->font_desc);
10244 pango_layout_get_size(xyplot->v_legends[i], &w,&h);
10245 if(w>xyplot->y_legends_width) xyplot->y_legends_width=w;
10246 }
10247 }
10248
10249 xyplot->x_legends_width/=PANGO_SCALE;
10250 xyplot->x_legends_height/=PANGO_SCALE;
10251 xyplot->y_legends_width/=PANGO_SCALE;
10252 xyplot->y_legends_height/=PANGO_SCALE;
10253
10254 xyplot->h_label_width = 0;
10255 xyplot->h_label_height =0;
10256 if (xyplot->h_label)
10257 {
10258 pango_layout_set_font_description (xyplot->h_label, widget->style->font_desc);
10259 pango_layout_get_size(xyplot->h_label, &(xyplot->h_label_width), &(xyplot->h_label_height));
10260 xyplot->h_label_width /=PANGO_SCALE;
10261 xyplot->h_label_height /=PANGO_SCALE;
10262 }
10263 xyplot->v_label_width = 0;
10264 xyplot->v_label_height =0;
10265 if (xyplot->v_label)
10266 {
10267 pango_layout_set_font_description (xyplot->v_label, widget->style->font_desc);
10268 pango_layout_get_size(xyplot->v_label, &(xyplot->v_label_width), &(xyplot->v_label_height));
10269 xyplot->v_label_width /=PANGO_SCALE;
10270 xyplot->v_label_height /=PANGO_SCALE;
10271 }
10272 }
10273 /****************************************************************************************/
xyplot_build_legends(GabeditXYPlot * xyplot)10274 static void xyplot_build_legends(GabeditXYPlot *xyplot)
10275 {
10276 GtkWidget *widget;
10277 gint loop;
10278
10279 g_return_if_fail (xyplot != NULL);
10280
10281 widget=GTK_WIDGET(xyplot);
10282
10283 if ( (xyplot->hmajor_ticks > 1) && (xyplot->x_legends_digits != 0)){
10284 xyplot->d_hlegend=fabs(xyplot->xmax-xyplot->xmin)/((gdouble)xyplot->hmajor_ticks-1.0);
10285
10286 xyplot->h_legends=g_new(PangoLayout*, xyplot->hmajor_ticks);
10287 if(xyplot->h_legends_str) g_free(xyplot->h_legends_str);
10288 xyplot->h_legends_str = g_malloc( (sizeof(gchar*) * xyplot->hmajor_ticks ) );
10289 for (loop=0; loop<xyplot->hmajor_ticks; loop++){
10290 xyplot->h_legends_str[loop] = g_malloc( (sizeof(gchar) * (xyplot->x_legends_digits+1)) );
10291 snprintf(xyplot->h_legends_str[loop] , xyplot->x_legends_digits+1, "%lf", xyplot->xmin + (gdouble)loop*xyplot->d_hlegend);
10292 xyplot->h_legends_str[loop] [xyplot->x_legends_digits]='\0';
10293 xyplot->h_legends[loop]=gtk_widget_create_pango_layout (widget, xyplot->h_legends_str[loop]);
10294 }
10295 }
10296
10297 if ((xyplot->vmajor_ticks > 1) && (xyplot->y_legends_digits != 0) ){
10298 xyplot->d_vlegend=fabs(xyplot->ymax-xyplot->ymin)/((gdouble)xyplot->vmajor_ticks-1.0);
10299
10300 xyplot->v_legends=g_new(PangoLayout*, xyplot->vmajor_ticks);
10301 if(xyplot->v_legends_str) g_free(xyplot->v_legends_str);
10302 xyplot->v_legends_str=g_malloc( (sizeof(gchar*) * xyplot->vmajor_ticks));
10303 for (loop=0; loop<xyplot->vmajor_ticks; loop++){
10304 xyplot->v_legends_str[loop]=g_malloc( (sizeof(gchar) * (xyplot->y_legends_digits+1)));
10305 snprintf(xyplot->v_legends_str[loop], xyplot->y_legends_digits+1, "%lf", xyplot->ymin + (gdouble)loop*xyplot->d_vlegend);
10306 xyplot->v_legends_str[loop][xyplot->y_legends_digits]='\0';
10307 xyplot->v_legends[loop]=gtk_widget_create_pango_layout (widget, xyplot->v_legends_str[loop]);
10308 }
10309 }
10310 xyplot->h_label = get_pango_str(xyplot, xyplot->h_label_str);
10311 xyplot->v_label = get_pango_str(xyplot, xyplot->v_label_str);
10312
10313 xyplot_calculate_legends_sizes(xyplot);
10314 }
10315 /****************************************************************************************/
xyplot_free_legends(GabeditXYPlot * xyplot)10316 static void xyplot_free_legends(GabeditXYPlot *xyplot)
10317 {
10318 gint loop;
10319
10320 g_return_if_fail (xyplot != NULL);
10321
10322 if (xyplot->h_legends!=NULL){
10323 for (loop=0; loop<xyplot->hmajor_ticks; loop++)
10324 if (xyplot->h_legends[loop]!=NULL)
10325 g_object_unref(G_OBJECT(xyplot->h_legends[loop]));
10326 g_free(xyplot->h_legends);
10327 xyplot->h_legends=NULL;
10328 }
10329
10330 if (xyplot->v_legends!=NULL){
10331 for (loop=0; loop<xyplot->vmajor_ticks; loop++)
10332 if (xyplot->v_legends[loop]!=NULL)
10333 g_object_unref(G_OBJECT(xyplot->v_legends[loop]));
10334 g_free(xyplot->v_legends);
10335 xyplot->v_legends=NULL;
10336 }
10337 if (xyplot->v_legends_str!=NULL)
10338 {
10339 for (loop=0; loop<xyplot->vmajor_ticks; loop++)
10340 g_free(xyplot->v_legends_str[loop]);
10341 g_free(xyplot->v_legends_str);
10342 }
10343 if (xyplot->h_legends_str!=NULL)
10344 {
10345 for (loop=0; loop<xyplot->hmajor_ticks; loop++)
10346 g_free(xyplot->h_legends_str[loop]);
10347 g_free(xyplot->h_legends_str);
10348 }
10349 xyplot->v_legends_str = NULL;
10350 xyplot->h_legends_str = NULL;
10351 }
10352 /****************************************************************************************/
xyplot_build_points_data(GabeditXYPlot * xyplot,XYPlotData * data)10353 static void xyplot_build_points_data(GabeditXYPlot *xyplot, XYPlotData *data)
10354 {
10355 GtkWidget *widget;
10356 if (xyplot == NULL) return;
10357 if(xyplot->data_list == NULL) return;
10358
10359 widget=GTK_WIDGET(xyplot);
10360 if(data->point_pango != NULL) g_object_unref(G_OBJECT(data->point_pango));
10361 data->point_pango = gtk_widget_create_pango_layout (widget, data->point_str);
10362 if(data->point_pango)
10363 {
10364 PangoRectangle logical_rect;
10365 pango_layout_set_justify(data->point_pango,TRUE);
10366 pango_layout_set_alignment(data->point_pango,PANGO_ALIGN_CENTER);
10367 pango_layout_set_alignment(data->point_pango,PANGO_ALIGN_LEFT);
10368 pango_layout_set_markup(data->point_pango, data->point_str, -1);
10369 gchar fontName[100];
10370 PangoAttrList *attr_list;
10371 PangoFontDescription *font_desc = NULL;
10372 sprintf(fontName,"sans %d",2+data->point_size*2);
10373 font_desc = pango_font_description_from_string (fontName);
10374 pango_layout_set_font_description (data->point_pango, font_desc);
10375 pango_layout_context_changed(data->point_pango);
10376 pango_layout_get_pixel_extents(data->point_pango, NULL, &logical_rect);
10377 pango_layout_get_size(data->point_pango, &(data->point_width), &(data->point_height));
10378 data->point_width/=PANGO_SCALE;
10379 data->point_height/=PANGO_SCALE;
10380 /* printf("%d %d\n",logical_rect.x,logical_rect.y);*/
10381 data->point_width =logical_rect.width;
10382 data->point_height =logical_rect.height;
10383 pango_font_description_free (font_desc);
10384 /* set color */
10385 attr_list = pango_layout_get_attributes (data->point_pango);
10386 if (attr_list == NULL) attr_list = pango_attr_list_new ();
10387 else pango_attr_list_ref (attr_list);
10388 pango_attr_list_insert(attr_list,
10389 pango_attr_foreground_new(
10390 data->point_color.red,
10391 data->point_color.green,
10392 data->point_color.blue)
10393 );
10394 pango_layout_set_attributes (data->point_pango, attr_list);
10395 pango_attr_list_unref (attr_list);
10396
10397 }
10398 }
10399 /****************************************************************************************/
xyplot_reflect_x(GabeditXYPlot * xyplot,gboolean reflection)10400 static void xyplot_reflect_x (GabeditXYPlot *xyplot, gboolean reflection)
10401 {
10402 g_return_if_fail (xyplot != NULL);
10403 g_return_if_fail (GABEDIT_IS_XYPLOT (xyplot));
10404
10405 if(xyplot->reflect_x == reflection) return;
10406
10407 xyplot->reflect_x = reflection;
10408 reset_object_text_pixels(xyplot);
10409 reset_object_line_pixels(xyplot);
10410 reset_object_image_pixels(xyplot);
10411 gtk_widget_queue_draw(GTK_WIDGET(xyplot));
10412 }
10413 /****************************************************************************************/
gabedit_xyplot_reflect_x(GabeditXYPlot * xyplot,gboolean enable)10414 void gabedit_xyplot_reflect_x (GabeditXYPlot *xyplot, gboolean enable)
10415 {
10416 GtkUIManager *manager = g_object_get_data(G_OBJECT (xyplot), "Manager");
10417 GtkAction* action = NULL;
10418 if(manager) action = gtk_ui_manager_get_action (manager, "/MenuXYPlot/Render/RenderDirections/DirectionReflectX");
10419 if(action) gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(action),enable);
10420 }
10421 /****************************************************************************************/
xyplot_reflect_y(GabeditXYPlot * xyplot,gboolean reflection)10422 static void xyplot_reflect_y (GabeditXYPlot *xyplot, gboolean reflection)
10423 {
10424 g_return_if_fail (xyplot != NULL);
10425 g_return_if_fail (GABEDIT_IS_XYPLOT (xyplot));
10426
10427 if(xyplot->reflect_y == reflection) return;
10428
10429 xyplot->reflect_y = reflection;
10430 reset_object_text_pixels(xyplot);
10431 reset_object_line_pixels(xyplot);
10432 reset_object_image_pixels(xyplot);
10433 gtk_widget_queue_draw(GTK_WIDGET(xyplot));
10434 }
10435 /****************************************************************************************/
gabedit_xyplot_reflect_y(GabeditXYPlot * xyplot,gboolean enable)10436 void gabedit_xyplot_reflect_y (GabeditXYPlot *xyplot, gboolean enable)
10437 {
10438 GtkUIManager *manager = g_object_get_data(G_OBJECT (xyplot), "Manager");
10439 GtkAction* action = NULL;
10440 if(manager) action = gtk_ui_manager_get_action (manager, "/MenuXYPlot/Render/RenderDirections/DirectionReflectY");
10441 if(action) gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(action),enable);
10442 }
10443 /****************************************************************************************/
xyplot_show_left_legends(GabeditXYPlot * xyplot,gboolean show)10444 static void xyplot_show_left_legends (GabeditXYPlot *xyplot, gboolean show)
10445 {
10446 g_return_if_fail (xyplot != NULL);
10447 g_return_if_fail (GABEDIT_IS_XYPLOT (xyplot));
10448
10449 if(xyplot->show_left_legends == show) return;
10450
10451 xyplot->show_left_legends = show;
10452 xyplot_build_legends(xyplot);
10453 xyplot_calculate_legends_sizes(xyplot);
10454 xyplot_calculate_sizes(xyplot);
10455 gtk_widget_queue_draw(GTK_WIDGET(xyplot));
10456 }
10457 /****************************************************************************************/
gabedit_xyplot_show_left_legends(GabeditXYPlot * xyplot,gboolean enable)10458 void gabedit_xyplot_show_left_legends (GabeditXYPlot *xyplot, gboolean enable)
10459 {
10460 GtkUIManager *manager = g_object_get_data(G_OBJECT (xyplot), "Manager");
10461 GtkAction* action = gtk_ui_manager_get_action (manager, "/MenuXYPlot/Render/RenderLegends/LegendShowLeft");
10462 if(action) gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(action),enable);
10463 }
10464 /****************************************************************************************/
xyplot_show_right_legends(GabeditXYPlot * xyplot,gboolean show)10465 static void xyplot_show_right_legends (GabeditXYPlot *xyplot, gboolean show)
10466 {
10467 g_return_if_fail (xyplot != NULL);
10468 g_return_if_fail (GABEDIT_IS_XYPLOT (xyplot));
10469
10470 if(xyplot->show_right_legends == show) return;
10471
10472 xyplot->show_right_legends = show;
10473 xyplot_build_legends(xyplot);
10474 xyplot_calculate_legends_sizes(xyplot);
10475 xyplot_calculate_sizes(xyplot);
10476 gtk_widget_queue_draw(GTK_WIDGET(xyplot));
10477 }
10478 /****************************************************************************************/
gabedit_xyplot_show_right_legends(GabeditXYPlot * xyplot,gboolean enable)10479 void gabedit_xyplot_show_right_legends (GabeditXYPlot *xyplot, gboolean enable)
10480 {
10481 GtkUIManager *manager = g_object_get_data(G_OBJECT (xyplot), "Manager");
10482 GtkAction* action = gtk_ui_manager_get_action (manager, "/MenuXYPlot/Render/RenderLegends/LegendShowRight");
10483 if(action) gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(action),enable);
10484 }
10485 /****************************************************************************************/
xyplot_show_top_legends(GabeditXYPlot * xyplot,gboolean show)10486 static void xyplot_show_top_legends (GabeditXYPlot *xyplot, gboolean show)
10487 {
10488 g_return_if_fail (xyplot != NULL);
10489 g_return_if_fail (GABEDIT_IS_XYPLOT (xyplot));
10490
10491 if(xyplot->show_top_legends == show) return;
10492
10493 xyplot->show_top_legends = show;
10494 xyplot_build_legends(xyplot);
10495 xyplot_calculate_legends_sizes(xyplot);
10496 xyplot_calculate_sizes(xyplot);
10497 gtk_widget_queue_draw(GTK_WIDGET(xyplot));
10498 }
10499 /****************************************************************************************/
gabedit_xyplot_show_top_legends(GabeditXYPlot * xyplot,gboolean enable)10500 void gabedit_xyplot_show_top_legends (GabeditXYPlot *xyplot, gboolean enable)
10501 {
10502 GtkUIManager *manager = g_object_get_data(G_OBJECT (xyplot), "Manager");
10503 GtkAction* action = gtk_ui_manager_get_action (manager, "/MenuXYPlot/Render/RenderLegends/LegendShowTop");
10504 if(action) gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(action),enable);
10505 }
10506 /****************************************************************************************/
xyplot_show_bottom_legends(GabeditXYPlot * xyplot,gboolean show)10507 static void xyplot_show_bottom_legends (GabeditXYPlot *xyplot, gboolean show)
10508 {
10509 g_return_if_fail (xyplot != NULL);
10510 g_return_if_fail (GABEDIT_IS_XYPLOT (xyplot));
10511
10512 if(xyplot->show_bottom_legends == show) return;
10513
10514 xyplot->show_bottom_legends = show;
10515 xyplot_build_legends(xyplot);
10516 xyplot_calculate_legends_sizes(xyplot);
10517 xyplot_calculate_sizes(xyplot);
10518 gtk_widget_queue_draw(GTK_WIDGET(xyplot));
10519 }
10520 /****************************************************************************************/
gabedit_xyplot_show_bottom_legends(GabeditXYPlot * xyplot,gboolean enable)10521 void gabedit_xyplot_show_bottom_legends (GabeditXYPlot *xyplot, gboolean enable)
10522 {
10523 GtkUIManager *manager = g_object_get_data(G_OBJECT (xyplot), "Manager");
10524 GtkAction* action = gtk_ui_manager_get_action (manager, "/MenuXYPlot/Render/RenderLegends/LegendShowBottom");
10525 if(action) gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(action),enable);
10526 }
10527 /****************************************************************************************/
xyplot_show_rectangle_legends(GabeditXYPlot * xyplot,gboolean show)10528 static void xyplot_show_rectangle_legends (GabeditXYPlot *xyplot, gboolean show)
10529 {
10530 g_return_if_fail (xyplot != NULL);
10531 g_return_if_fail (GABEDIT_IS_XYPLOT (xyplot));
10532
10533 if(xyplot->show_rectangle_legends == show) return;
10534
10535 xyplot->show_rectangle_legends = show;
10536 xyplot_build_legends(xyplot);
10537 xyplot_calculate_legends_sizes(xyplot);
10538 xyplot_calculate_sizes(xyplot);
10539 gtk_widget_queue_draw(GTK_WIDGET(xyplot));
10540 }
10541 /****************************************************************************************/
gabedit_xyplot_show_rectangle_legends(GabeditXYPlot * xyplot,gboolean enable)10542 void gabedit_xyplot_show_rectangle_legends (GabeditXYPlot *xyplot, gboolean enable)
10543 {
10544 GtkUIManager *manager = g_object_get_data(G_OBJECT (xyplot), "Manager");
10545 GtkAction* action = gtk_ui_manager_get_action (manager, "/MenuXYPlot/Render/RenderLegends/LegendShowRectangle");
10546 if(action) gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(action),enable);
10547 }
10548 /****************************************************************************************/
gabedit_xyplot_set_font(GabeditXYPlot * xyplot,gchar * fontName)10549 void gabedit_xyplot_set_font (GabeditXYPlot *xyplot, gchar* fontName)
10550 {
10551 GtkWidget* widget = NULL;
10552 g_return_if_fail (xyplot != NULL);
10553 g_return_if_fail (GABEDIT_IS_XYPLOT (xyplot));
10554 PangoFontDescription *font_desc = pango_font_description_from_string (fontName);
10555
10556 widget=GTK_WIDGET(xyplot);
10557
10558 if(font_desc)
10559 {
10560 xyplot->font_size = xyplot_get_font_size (widget, font_desc);
10561 gtk_widget_modify_font (widget, font_desc);
10562 xyplot_build_legends(xyplot);
10563 xyplot_calculate_legends_sizes(xyplot);
10564 xyplot_calculate_sizes(xyplot);
10565 gtk_widget_queue_draw(GTK_WIDGET(xyplot));
10566 }
10567 }
10568 /****************************************************************************************/
gabedit_xyplot_set_x_label(GabeditXYPlot * xyplot,G_CONST_RETURN gchar * str)10569 void gabedit_xyplot_set_x_label (GabeditXYPlot *xyplot, G_CONST_RETURN gchar* str)
10570 {
10571 GtkWidget* widget = NULL;
10572 g_return_if_fail (xyplot != NULL);
10573 g_return_if_fail (GABEDIT_IS_XYPLOT (xyplot));
10574 widget=GTK_WIDGET(xyplot);
10575
10576 if(xyplot->h_label_str) g_free(xyplot->h_label_str);
10577 if(str && strlen(str)>0)
10578 {
10579 xyplot->h_label_str = g_strdup(str);
10580 }
10581 else
10582 {
10583 xyplot->h_label_str = NULL;
10584 }
10585
10586 xyplot_build_legends(xyplot);
10587 xyplot_calculate_legends_sizes(xyplot);
10588 xyplot_calculate_sizes(xyplot);
10589 gtk_widget_queue_draw(GTK_WIDGET(xyplot));
10590 }
10591 /****************************************************************************************/
gabedit_xyplot_set_y_label(GabeditXYPlot * xyplot,G_CONST_RETURN gchar * str)10592 void gabedit_xyplot_set_y_label (GabeditXYPlot *xyplot, G_CONST_RETURN gchar* str)
10593 {
10594 GtkWidget* widget = NULL;
10595 g_return_if_fail (xyplot != NULL);
10596 g_return_if_fail (GABEDIT_IS_XYPLOT (xyplot));
10597 widget=GTK_WIDGET(xyplot);
10598
10599 if(xyplot->v_label_str) g_free(xyplot->v_label_str);
10600 if(str && strlen(str)>0)
10601 {
10602 xyplot->v_label_str = g_strdup(str);
10603 }
10604 else
10605 xyplot->v_label_str = NULL;
10606
10607 xyplot_build_legends(xyplot);
10608 xyplot_calculate_legends_sizes(xyplot);
10609 xyplot_calculate_sizes(xyplot);
10610 gtk_widget_queue_draw(GTK_WIDGET(xyplot));
10611 }
10612 /****************************************************************************************/
xyplot_motion_notify_event(GtkWidget * xyplot,GdkEventMotion * event,gpointer user_data)10613 static gboolean xyplot_motion_notify_event(GtkWidget *xyplot, GdkEventMotion *event, gpointer user_data)
10614 {
10615 double xv, yv;
10616 int x, y;
10617 char str[50];
10618 int context_id;
10619 GtkWidget* statusbar = g_object_get_data(G_OBJECT (xyplot), "StatusBar");
10620
10621 x=event->x;
10622 y=event->y;
10623
10624 if (event->is_hint || (event->window != xyplot->window))
10625 gdk_window_get_pointer (xyplot->window, &x, &y, NULL);
10626
10627 if(gabedit_xyplot_get_point(GABEDIT_XYPLOT(xyplot), x, y, &xv, &yv))
10628 snprintf(str, 50, "Mouse position: %f, %f", xv, yv);
10629 else
10630 sprintf(str, " ");
10631 context_id=gtk_statusbar_get_context_id (GTK_STATUSBAR(statusbar), "mouse position");
10632 gtk_statusbar_push (GTK_STATUSBAR(statusbar), context_id, str);
10633
10634 return TRUE;
10635 }
10636 /****************************************************************************************/
gabedit_xyplot_new_window(gchar * title,GtkWidget * parent)10637 GtkWidget* gabedit_xyplot_new_window(gchar* title, GtkWidget*parent)
10638 {
10639 GtkWidget* window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
10640 GtkWidget* table = NULL;
10641 GtkWidget* box = NULL;
10642 GtkWidget* frame_xyplot = NULL;
10643 GtkWidget* xyplot = NULL;
10644
10645 GtkWidget *statusbar = NULL;
10646
10647 gtk_window_set_title (GTK_WINDOW (window), title);
10648 gtk_signal_connect (GTK_OBJECT (window), "delete_event", G_CALLBACK (gtk_widget_destroy), NULL);
10649 gtk_container_set_border_width (GTK_CONTAINER (window), 2);
10650 gtk_window_set_default_size (GTK_WINDOW(window),2*gdk_screen_width()/3,2*gdk_screen_height()/3);
10651
10652 table=gtk_table_new(3, 1, FALSE);
10653 gtk_container_add(GTK_CONTAINER(window), table);
10654 gtk_widget_show(table);
10655
10656 frame_xyplot=gtk_frame_new("XY GabeditPlot");
10657 gtk_table_attach(GTK_TABLE(table), frame_xyplot, 0, 1, 0, 1, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
10658 gtk_widget_show(frame_xyplot);
10659
10660 xyplot = gabedit_xyplot_new();
10661 gtk_container_add(GTK_CONTAINER(frame_xyplot), xyplot);
10662 gtk_widget_show (xyplot);
10663
10664 g_object_set_data (G_OBJECT (window), "XYPLOT",xyplot);
10665
10666 box=gtk_hbox_new(FALSE,0);
10667 gtk_table_attach(GTK_TABLE(table), box, 0, 1, 1, 2, GTK_FILL, GTK_FILL, 5, 5);
10668 gtk_widget_show (box);
10669 g_object_set_data(G_OBJECT (xyplot), "Box", box);
10670
10671 statusbar=gtk_statusbar_new();
10672 gtk_table_attach(GTK_TABLE(table), statusbar, 0, 1, 2, 3, GTK_FILL, GTK_FILL, 5, 5);
10673 gtk_widget_show (statusbar);
10674 g_object_set_data(G_OBJECT (xyplot), "StatusBar", statusbar);
10675
10676 if(parent) gtk_window_set_transient_for(GTK_WINDOW(window),GTK_WINDOW(parent));
10677 gtk_widget_show (window);
10678
10679 gabedit_xyplot_set_range(GABEDIT_XYPLOT(xyplot), 0.0, 10, 0, 20);
10680 gabedit_xyplot_set_x_legends_digits(GABEDIT_XYPLOT(xyplot), 5);
10681 gabedit_xyplot_set_y_legends_digits(GABEDIT_XYPLOT(xyplot), 5);
10682
10683
10684
10685 gabedit_xyplot_enable_grids (GABEDIT_XYPLOT(xyplot), GABEDIT_XYPLOT_HMAJOR_GRID, FALSE);
10686 gabedit_xyplot_enable_grids (GABEDIT_XYPLOT(xyplot), GABEDIT_XYPLOT_VMAJOR_GRID, FALSE);
10687 gabedit_xyplot_show_top_legends (GABEDIT_XYPLOT(xyplot),FALSE);
10688 gabedit_xyplot_show_right_legends (GABEDIT_XYPLOT(xyplot),FALSE);
10689
10690 g_signal_connect_after(G_OBJECT(xyplot), "motion-notify-event", G_CALLBACK(xyplot_motion_notify_event), NULL);
10691
10692 g_object_set_data(G_OBJECT (xyplot), "Window", window);
10693 g_object_set_data(G_OBJECT (window), "Box", box);
10694
10695 gabedit_xyplot_set_font (GABEDIT_XYPLOT(xyplot), "sans 12");
10696
10697 return window;
10698 }
10699 /****************************************************************************************/
gabedit_xyplot_add_data_peaks(GabeditXYPlot * xyplot,gint numberOfPoints,gdouble * X,gdouble * Y,GdkColor * color)10700 void gabedit_xyplot_add_data_peaks(GabeditXYPlot *xyplot, gint numberOfPoints, gdouble* X, gdouble* Y, GdkColor* color)
10701 {
10702 g_return_if_fail (xyplot != NULL);
10703 g_return_if_fail (GABEDIT_IS_XYPLOT (xyplot));
10704 g_return_if_fail (X != NULL);
10705 g_return_if_fail (Y != NULL);
10706 if(numberOfPoints>0)
10707 {
10708 gint loop;
10709 XYPlotData *data = g_malloc(sizeof(XYPlotData));
10710 gint red = 0;
10711 gint green = 0;
10712 gint blue = 0;
10713 gdouble xmin = 0;
10714 gdouble xmax = 0;
10715
10716 if(color)
10717 {
10718 red = (color->red);
10719 green = (color->green);
10720 blue = (color->blue);
10721 }
10722 else
10723 {
10724 GdkColor c = get_fore_color(xyplot);
10725 red = c.red;
10726 green = c.green;
10727 blue = c.blue;
10728 }
10729
10730 data->size=3*numberOfPoints+2;
10731 data->x = g_malloc(data->size*sizeof(gdouble));
10732 data->y = g_malloc(data->size*sizeof(gdouble));
10733
10734 xmin = X[0];
10735 xmax = X[0];
10736 for(loop = 1; loop<numberOfPoints;loop++)
10737 {
10738 if(xmin>X[loop]) xmin = X[loop];
10739 if(xmax<X[loop]) xmax = X[loop];
10740 }
10741
10742 data->x[0]=xmin;
10743 data->y[0]=0;
10744 data->x[data->size-1]=xmax;
10745 data->y[data->size-1]=0;
10746 for (loop=0; loop<numberOfPoints; loop++){
10747 gint iold = loop*3+1;
10748 data->x[iold]=X[loop];
10749 data->y[iold]=0;
10750
10751 data->x[iold+1]=X[loop];
10752 data->y[iold+1]=Y[loop];
10753
10754 data->x[iold+2]=X[loop];
10755 data->y[iold+2]=0;
10756 }
10757
10758 sprintf(data->point_str,"+");
10759 data->point_pango = NULL;
10760 xyplot_build_points_data(GABEDIT_XYPLOT(xyplot), data);
10761
10762 data->point_size=0;
10763 data->line_width=2;
10764 data->point_color.red=green;
10765 data->point_color.green=red;
10766 data->point_color.blue=blue;
10767
10768 data->line_color.red=red;
10769 data->line_color.green=green;
10770 data->line_color.blue=blue;
10771 data->line_style=GDK_LINE_SOLID;
10772 gabedit_xyplot_add_data (GABEDIT_XYPLOT(xyplot), data);
10773 gabedit_xyplot_set_autorange(GABEDIT_XYPLOT(xyplot), NULL);
10774 }
10775 }
10776 /****************************************************************************************/
xyplot_curve_noconv(GabeditXYPlot * xyplot,gint numberOfPoints,gdouble * X,gdouble * Y,GdkColor * color)10777 static void xyplot_curve_noconv(GabeditXYPlot *xyplot, gint numberOfPoints, gdouble* X, gdouble* Y, GdkColor* color)
10778 {
10779 gint loop;
10780 gint red = 0;
10781 gint green = 0;
10782 gint blue = 0;
10783 XYPlotData *data = g_malloc(sizeof(XYPlotData));
10784
10785 if(color)
10786 {
10787 red = (color->red);
10788 green = (color->green);
10789 blue = (color->blue);
10790 }
10791 else
10792 {
10793 GdkColor c = get_fore_color(xyplot);
10794 red = c.red;
10795 green = c.green;
10796 blue = c.blue;
10797 }
10798
10799 data->size=numberOfPoints;
10800 if(data->size>0)
10801 {
10802 data->x = g_malloc(data->size*sizeof(gdouble));
10803 data->y = g_malloc(data->size*sizeof(gdouble));
10804 }
10805
10806 for (loop=0; loop<data->size; loop++){
10807 data->x[loop]=X[loop];
10808 data->y[loop]=Y[loop];
10809 }
10810 sprintf(data->point_str,"+");
10811
10812 data->point_size=0;
10813 data->line_width=2;
10814 data->point_color.red=red;
10815 data->point_color.green=green;
10816 data->point_color.blue=blue;
10817
10818 data->line_color.red=green;
10819 data->line_color.green=red;
10820 data->line_color.blue=blue;
10821 data->line_style=GDK_LINE_SOLID;
10822 gabedit_xyplot_add_data (GABEDIT_XYPLOT(xyplot), data);
10823 gabedit_xyplot_set_autorange(GABEDIT_XYPLOT(xyplot), NULL);
10824
10825 }
10826 /********************************************************************************/
lorentzianLineshape(gdouble rel_offset)10827 static gdouble lorentzianLineshape(gdouble rel_offset)
10828 {
10829 return 1.0 / (1.0 + rel_offset * rel_offset);
10830 }
10831 /********************************************************************************/
gaussianLineshape(gdouble rel_offset)10832 static gdouble gaussianLineshape(gdouble rel_offset)
10833 {
10834 gdouble nln2 = -log(2.0);
10835 return exp(nln2 * rel_offset * rel_offset);
10836 }
10837 /****************************************************************************************/
build_data_xyplot_curve_withconv(GabeditXYPlot * xyplot,gint numberOfPoints,gdouble * X,gdouble * Y,gdouble halfWidth,gdouble (* lineshape)(gdouble),GdkColor * color)10838 static void build_data_xyplot_curve_withconv(GabeditXYPlot *xyplot, gint numberOfPoints, gdouble* X, gdouble* Y, gdouble halfWidth, gdouble (*lineshape)(gdouble), GdkColor* color)
10839 {
10840 gint i;
10841 gint j;
10842 gint n = 0;
10843 gdouble xx ;
10844 gdouble h0 = halfWidth/20;
10845 gint red = 0;
10846 gint green = 0;
10847 gint blue = 0;
10848 XYPlotData *data = g_malloc(sizeof(XYPlotData));
10849 gdouble xmin = 0;
10850 gdouble xmax = 0;
10851
10852 if(color)
10853 {
10854 red = (color->red);
10855 green = (color->green);
10856 blue = (color->blue);
10857 }
10858 else
10859 {
10860 GdkColor c = get_fore_color(xyplot);
10861 red = c.red;
10862 green = c.green;
10863 blue = c.blue;
10864 }
10865
10866 data->size=0;
10867 data->point_size=0;
10868 data->line_width=2;
10869 data->point_color.red=green;
10870 data->point_color.green=red;
10871 data->point_color.blue=blue;
10872
10873 data->line_color.red=red;
10874 data->line_color.green=green;
10875 data->line_color.blue=blue;
10876 data->line_style=GDK_LINE_SOLID;
10877
10878 data->x = NULL;
10879 data->y = NULL;
10880
10881 if(numberOfPoints<1||!X||!Y) return;
10882
10883 xmin = X[0];
10884 xmax = X[0];
10885 for (i=0; i<numberOfPoints; i++){
10886 if(X[i]<xmin) xmin = X[i];
10887 if(X[i]>xmax) xmax = X[i];
10888 }
10889
10890 xmin -= 10*halfWidth;
10891 xmax += 10*halfWidth;
10892 xx = xmin;
10893 h0 = halfWidth/10;
10894 n = (gint)((xmax-xmin)/h0+0.5)+numberOfPoints;
10895 if(n>0) data->x = (gdouble*)g_malloc(sizeof(gdouble)*n);
10896 if(numberOfPoints>0 && n>0)
10897 do
10898 {
10899 gdouble dmin = 0.0;
10900 gdouble d = 0.0;
10901 gint jmin = 0;
10902 for (j=0; j < numberOfPoints; j++)
10903 {
10904 gdouble center = (gdouble) X[j];
10905 d = fabs(xx - center);
10906 if(d<dmin || j==0)
10907 {
10908 jmin = j;
10909 dmin = d;
10910 }
10911 }
10912 data->x[data->size] = xx;
10913 if(dmin<h0)
10914 {
10915 if(xx< X[jmin])
10916 {
10917 xx = (gdouble) X[jmin];
10918 data->x[data->size] = xx;
10919 xx += h0+1e-8;
10920 }
10921 else
10922 {
10923 xx = (gdouble) X[jmin];
10924 data->x[data->size] = xx;
10925 xx += h0+1e-8;
10926 }
10927 }
10928 else
10929 {
10930 if(dmin> 5*halfWidth) xx += h0+dmin/5;
10931 else xx += h0;
10932 }
10933 data->size++;
10934 }while(xx<xmax && data->size<n);
10935
10936 if(data->size>0)
10937 {
10938 data->x = (gdouble*)g_realloc(data->x,sizeof(gdouble)*data->size);
10939 data->y = (gdouble*)g_malloc(sizeof(gdouble)*data->size);
10940 }
10941
10942 if(numberOfPoints>0)
10943 for (i=0; i < data->size; i++)
10944 {
10945 gdouble yy = 0.0;
10946 for (j=0; j < numberOfPoints; j++)
10947 {
10948 gdouble center = (gdouble) X[j];
10949 gdouble rel_offset = (data->x[i] - center) / halfWidth;
10950 yy += Y[j]*lineshape(rel_offset);
10951 }
10952 data->y[i] = yy;
10953 }
10954
10955 sprintf(data->point_str,"+");
10956 data->point_pango = NULL;
10957 xyplot_build_points_data(GABEDIT_XYPLOT(xyplot), data);
10958 gabedit_xyplot_add_data (GABEDIT_XYPLOT(xyplot), data);
10959 gabedit_xyplot_set_autorange(GABEDIT_XYPLOT(xyplot), NULL);
10960 }
10961 /****************************************************************************************/
gabedit_xyplot_add_data_conv(GabeditXYPlot * xyplot,gint numberOfPoints,gdouble * X,gdouble * Y,gdouble halfWidth,GabeditXYPlotConvType convType,GdkColor * color)10962 void gabedit_xyplot_add_data_conv(GabeditXYPlot *xyplot, gint numberOfPoints, gdouble* X, gdouble* Y, gdouble halfWidth,GabeditXYPlotConvType convType, GdkColor* color)
10963 {
10964 switch(convType)
10965 {
10966 case GABEDIT_XYPLOT_CONV_NONE :
10967 xyplot_curve_noconv(xyplot, numberOfPoints, X, Y, color);
10968 break;
10969 case GABEDIT_XYPLOT_CONV_LORENTZ :
10970 build_data_xyplot_curve_withconv(xyplot, numberOfPoints, X, Y, halfWidth, lorentzianLineshape, color);
10971 break;
10972 case GABEDIT_XYPLOT_CONV_GAUSS :
10973 build_data_xyplot_curve_withconv(xyplot, numberOfPoints, X, Y, halfWidth, gaussianLineshape, color);
10974 }
10975
10976 }
10977 /****************************************************************************************/
gabedit_xyplot_help()10978 void gabedit_xyplot_help()
10979 {
10980 GtkWidget* dialog = NULL;
10981 GtkWidget *label, *button;
10982 GtkWidget *frame, *vboxframe;
10983 GtkWidget* hbox;
10984
10985 gchar* tmp = g_strdup_printf(
10986 _(
10987 "Mouse buttons and Keys :\n"
10988 "\t Right button : popup menu\n"
10989 "\t Middle button : zoom\n"
10990 "\t Left button + Control key : zoom\n"
10991 "\t Left button + t key : insert a text\n"
10992 "\t Left button + l key : insert a line (arrow)\n"
10993 "\t Left button + i key : insert an image from a png file\n"
10994 "\t Left button + r key : remove selected image/text/line\n"
10995 "\t Ctrl + V (Alt + V) : insert an image from clipboard\n"
10996 "\t Left button + Shift key : compute distance between 2 points\n"
10997 "\t Left button, double click : select a data to change\n"
10998 "\t Left button clicked on bottom right corner + move : change the width/height for an image\n"
10999 "\n\n"
11000 "Popup menu :\n"
11001 "\t Set : ticks, margins, ranges, X and Y labels, digits, font size, auto ranges\n"
11002 "\t Render : grids, directions, legends\n"
11003 "\t Data : read data from multiple format(txt 2 or more, JDX, jMRUI)\n"
11004 "\t A backspace ligne in a txt file is interpreted as a beginning new data\n"
11005 "\t Save all data at a txt file\n"
11006 "\t Remove all all\n"
11007 "\t change data (scale, shift, ...)\n"
11008 "\t Objects : for insert/delete texts, lines or images\n"
11009 "\t Screen capture : BMP, JPEG, PNG, Transparent PNG, TIF\n"
11010 "\t Export image : SVG, PS, EPS and PDF (this is a real export, not a capture)\n"
11011 "\t Read : read all (parameters, data, texts, lines, images) from a Gabedit file\n"
11012 "\t Save : save all (parameters, data, texts, lines, images) in Gabedit file\n"
11013 "\t Help : for obtain this window (You guessed :))\n"
11014 "\t Close : very simple :)\n"
11015 )
11016 );
11017
11018 dialog = gtk_dialog_new();
11019 gtk_widget_realize(GTK_WIDGET(dialog));
11020
11021 gtk_window_set_title(GTK_WINDOW(dialog),_("Help"));
11022 g_signal_connect(G_OBJECT(dialog), "delete_event", (GCallback)gtk_widget_destroy, NULL);
11023 frame = gtk_frame_new (NULL);
11024 gtk_frame_set_shadow_type( GTK_FRAME(frame),GTK_SHADOW_ETCHED_OUT);
11025 gtk_container_set_border_width (GTK_CONTAINER (frame), 5);
11026 gtk_box_pack_start( GTK_BOX(GTK_DIALOG(dialog)->vbox), frame,TRUE,TRUE,0);
11027
11028 gtk_widget_show (frame);
11029 vboxframe = gtk_vbox_new (FALSE, 0);
11030 gtk_container_add(GTK_CONTAINER(frame), vboxframe);
11031 label = gtk_label_new(tmp);
11032 gtk_widget_show (label);
11033 gtk_label_set_justify(GTK_LABEL(label),GTK_JUSTIFY_LEFT);
11034 hbox = gtk_hbox_new (FALSE, 5);
11035 gtk_box_pack_start (GTK_BOX (vboxframe), hbox, FALSE, FALSE, 5);
11036 gtk_box_pack_start (GTK_BOX(hbox), label, FALSE, FALSE, 5);
11037 gtk_widget_show (hbox);
11038
11039 gtk_box_set_homogeneous (GTK_BOX( GTK_DIALOG(dialog)->action_area), FALSE);
11040 button = gtk_button_new_from_stock (GTK_STOCK_OK);
11041 gtk_box_pack_end (GTK_BOX( GTK_DIALOG(dialog)->action_area), button, FALSE, TRUE, 5);
11042 GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT);
11043 gtk_widget_grab_default(button);
11044 g_signal_connect_swapped(G_OBJECT(button), "clicked",
11045 (GCallback)gtk_widget_destroy,
11046 GTK_OBJECT(dialog));
11047
11048 gtk_widget_show_all(dialog);
11049 gtk_window_set_modal (GTK_WINDOW (dialog), TRUE);
11050 g_free(tmp);
11051 }
11052 /****************************************************************************************/
gabedit_xyplot_set_data_line_width(GabeditXYPlot * xyplot,gdouble line_width)11053 void gabedit_xyplot_set_data_line_width (GabeditXYPlot *xyplot, gdouble line_width)
11054 {
11055 g_return_if_fail (xyplot != NULL);
11056 g_return_if_fail (GABEDIT_IS_XYPLOT (xyplot));
11057
11058 if(line_width<0) line_width = 0;
11059 gtk_widget_queue_draw(GTK_WIDGET(xyplot));
11060 XYPlotData *current_data;
11061 GList *current_node;
11062
11063 if (xyplot->data_list ){
11064 current_node=g_list_first(xyplot->data_list);
11065 current_data=(XYPlotData*)current_node->data;
11066 for (; current_node!=NULL; current_node=current_node->next)
11067 {
11068 current_data=(XYPlotData*)current_node->data;
11069 current_data->line_width = line_width;
11070 }
11071 }
11072 xyplot_free_legends(xyplot);
11073 xyplot_build_legends(xyplot);
11074 xyplot_calculate_sizes(xyplot);
11075
11076 gtk_widget_queue_draw(GTK_WIDGET(xyplot));
11077 }
11078 /****************************************************************************************/
gabedit_xyplot_set_data_point_size(GabeditXYPlot * xyplot,gdouble point_size)11079 void gabedit_xyplot_set_data_point_size (GabeditXYPlot *xyplot, gdouble point_size)
11080 {
11081 g_return_if_fail (xyplot != NULL);
11082 g_return_if_fail (GABEDIT_IS_XYPLOT (xyplot));
11083
11084 if(point_size<0) point_size = 0;
11085 gtk_widget_queue_draw(GTK_WIDGET(xyplot));
11086 XYPlotData *current_data;
11087 GList *current_node;
11088
11089 if (xyplot->data_list ){
11090 current_node=g_list_first(xyplot->data_list);
11091 current_data=(XYPlotData*)current_node->data;
11092 for (; current_node!=NULL; current_node=current_node->next)
11093 {
11094 current_data=(XYPlotData*)current_node->data;
11095 current_data->point_size = point_size;
11096 xyplot_build_points_data(GABEDIT_XYPLOT(xyplot), current_data);
11097 }
11098 }
11099 xyplot_free_legends(xyplot);
11100 xyplot_build_legends(xyplot);
11101 xyplot_calculate_sizes(xyplot);
11102
11103 gtk_widget_queue_draw(GTK_WIDGET(xyplot));
11104 }
11105 /****************************************************************************************/
gabedit_xyplot_set_data_point_type(GabeditXYPlot * xyplot,gchar c)11106 void gabedit_xyplot_set_data_point_type (GabeditXYPlot *xyplot, gchar c)
11107 {
11108 g_return_if_fail (xyplot != NULL);
11109 g_return_if_fail (GABEDIT_IS_XYPLOT (xyplot));
11110
11111 gtk_widget_queue_draw(GTK_WIDGET(xyplot));
11112 XYPlotData *current_data;
11113 GList *current_node;
11114
11115 if (xyplot->data_list ){
11116 current_node=g_list_first(xyplot->data_list);
11117 current_data=(XYPlotData*)current_node->data;
11118 for (; current_node!=NULL; current_node=current_node->next)
11119 {
11120 current_data=(XYPlotData*)current_node->data;
11121 sprintf(current_data->point_str,"%c",c);
11122 xyplot_build_points_data(GABEDIT_XYPLOT(xyplot), current_data);
11123 }
11124 }
11125 xyplot_free_legends(xyplot);
11126 xyplot_build_legends(xyplot);
11127 xyplot_calculate_sizes(xyplot);
11128
11129 gtk_widget_queue_draw(GTK_WIDGET(xyplot));
11130 }
11131 /****************************************************************************************/
gabedit_xyplot_set_data_point_color(GabeditXYPlot * xyplot,gdouble red,gdouble green,gdouble blue)11132 void gabedit_xyplot_set_data_point_color (GabeditXYPlot *xyplot, gdouble red, gdouble green, gdouble blue)
11133 {
11134 g_return_if_fail (xyplot != NULL);
11135 g_return_if_fail (GABEDIT_IS_XYPLOT (xyplot));
11136
11137 gtk_widget_queue_draw(GTK_WIDGET(xyplot));
11138 XYPlotData *current_data;
11139 GList *current_node;
11140
11141 if (xyplot->data_list ){
11142 current_node=g_list_first(xyplot->data_list);
11143 current_data=(XYPlotData*)current_node->data;
11144 for (; current_node!=NULL; current_node=current_node->next)
11145 {
11146 current_data=(XYPlotData*)current_node->data;
11147 current_data->point_color.red = SCALE2(red);
11148 current_data->point_color.green = SCALE2(green);
11149 current_data->point_color.blue = SCALE2(blue);
11150 xyplot_build_points_data(GABEDIT_XYPLOT(xyplot), current_data);
11151 }
11152 }
11153 xyplot_free_legends(xyplot);
11154 xyplot_build_legends(xyplot);
11155 xyplot_calculate_sizes(xyplot);
11156
11157 gtk_widget_queue_draw(GTK_WIDGET(xyplot));
11158 }
11159 /********************************************************************************/
gabedit_xyplot_add_new_data(GtkWidget * xyplot,gint numberOfPoints,gdouble * X,gdouble * Y)11160 void gabedit_xyplot_add_new_data(GtkWidget* xyplot, gint numberOfPoints, gdouble* X, gdouble* Y)
11161 {
11162 add_new_data(xyplot, numberOfPoints, X, Y);
11163 }
11164 /****************************************************************************************/
gabedit_xyplot_set_last_data_line_width(GabeditXYPlot * xyplot,gdouble line_width)11165 void gabedit_xyplot_set_last_data_line_width (GabeditXYPlot *xyplot, gdouble line_width)
11166 {
11167 g_return_if_fail (xyplot != NULL);
11168 g_return_if_fail (GABEDIT_IS_XYPLOT (xyplot));
11169
11170 if(line_width<0) line_width = 0;
11171 gtk_widget_queue_draw(GTK_WIDGET(xyplot));
11172 XYPlotData *current_data;
11173 GList *current_node;
11174
11175 if (xyplot->data_list ){
11176 current_node=g_list_first(xyplot->data_list);
11177 current_data=(XYPlotData*)current_node->data;
11178 for (; current_node!=NULL; current_node=current_node->next)
11179 {
11180 current_data=(XYPlotData*)current_node->data;
11181 }
11182 current_data->line_width = line_width;
11183 }
11184 xyplot_free_legends(xyplot);
11185 xyplot_build_legends(xyplot);
11186 xyplot_calculate_sizes(xyplot);
11187
11188 gtk_widget_queue_draw(GTK_WIDGET(xyplot));
11189 }
11190 /****************************************************************************************/
gabedit_xyplot_set_last_data_point_size(GabeditXYPlot * xyplot,gdouble point_size)11191 void gabedit_xyplot_set_last_data_point_size (GabeditXYPlot *xyplot, gdouble point_size)
11192 {
11193 g_return_if_fail (xyplot != NULL);
11194 g_return_if_fail (GABEDIT_IS_XYPLOT (xyplot));
11195
11196 if(point_size<0) point_size = 0;
11197 gtk_widget_queue_draw(GTK_WIDGET(xyplot));
11198 XYPlotData *current_data;
11199 GList *current_node;
11200
11201 if (xyplot->data_list ){
11202 current_node=g_list_first(xyplot->data_list);
11203 current_data=(XYPlotData*)current_node->data;
11204 for (; current_node!=NULL; current_node=current_node->next)
11205 {
11206 current_data=(XYPlotData*)current_node->data;
11207 }
11208 current_data->point_size = point_size;
11209 xyplot_build_points_data(GABEDIT_XYPLOT(xyplot), current_data);
11210 }
11211 xyplot_free_legends(xyplot);
11212 xyplot_build_legends(xyplot);
11213 xyplot_calculate_sizes(xyplot);
11214
11215 gtk_widget_queue_draw(GTK_WIDGET(xyplot));
11216 }
11217 /****************************************************************************************/
gabedit_xyplot_add_object_text(GabeditXYPlot * xyplot,gdouble x,gdouble y,gdouble angle,G_CONST_RETURN gchar * str)11218 void gabedit_xyplot_add_object_text (GabeditXYPlot *xyplot, gdouble x, gdouble y, gdouble angle, G_CONST_RETURN gchar* str)
11219 {
11220 add_object_text(GABEDIT_XYPLOT(xyplot), x, y, angle, str);
11221 }
11222