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>&#9733;</span>","+","x",
5357 		"<span>&#9675;</span>", "<span>&#9679;</span>",
5358 		"<span>&#9688;</span>", "<span>&#9689;</span>",
5359 		"<span>&#9670;</span>", "<span>&#9674;</span>",
5360 		"<span>&#8226;</span>",
5361 		"<span><b>&#9788;</b></span>",
5362 		"<span>&#9651;</span>", "<span>&#9650;</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