1 /***************************************************************************
2   FAC_toggle.cpp
3   Handle dialog factory element : Toggle
4   (C) 2006 Mean Fixounet@free.fr
5 ***************************************************************************/
6 
7 /***************************************************************************
8  *                                                                         *
9  *   This program is free software; you can redistribute it and/or modify  *
10  *   it under the terms of the GNU General Public License as published by  *
11  *   the Free Software Foundation; either version 2 of the License, or     *
12  *   (at your option) any later version.                                   *
13  *                                                                         *
14  ***************************************************************************/
15 
16 #include "ADM_toolkitGtk.h"
17 #include "DIA_factory.h"
18 
19 namespace ADM_GtkFactory
20 {
21 class diaElemToggle : public diaElemToggleBase
22 {
23   protected:
24 public:
25             diaElemToggle(bool *toggleValue,const char *toggleTitle, const char *tip=NULL);
26   virtual   ~diaElemToggle() ;
27   void      setMe(void *dialog, void *opaque,uint32_t line);
28   void      getMe(void);
29   void      enable(uint32_t onoff) ;
30   void      finalize(void);
31   void      updateMe();
32   uint8_t   link(uint32_t onoff,diaElem *w);
33   int getRequiredLayout(void);
34 };
35 
36 class diaElemToggleUint : public diaElem
37 {
38   protected:
39         uint32_t *emb;
40         const char *embName;
41         void *widgetUint;
42         uint32_t _min,_max;
43 public:
44             diaElemToggleUint(uint32_t *toggleValue,const char *toggleTitle, uint32_t *uintval,
45             					const char *name,uint32_t min,uint32_t max,const char *tip=NULL);
46   virtual   ~diaElemToggleUint() ;
47   void      setMe(void *dialog, void *opaque,uint32_t line);
48   void      getMe(void);
49   void      enable(uint32_t onoff) ;
50   void      finalize(void);
51   void      updateMe();
52   int getRequiredLayout(void);
53 };
54 class diaElemToggleInt : public diaElem
55 {
56   protected:
57 	  		 int32_t *emb;
58 	         const char *embName;
59 	         void *widgetUint;
60 	         int32_t _min,_max;
61 public:
62             diaElemToggleInt(uint32_t *toggleValue,const char *toggleTitle, int32_t *uintval,
63             				const char *name,int32_t min,int32_t max,const char *tip=NULL);
64   virtual   ~diaElemToggleInt() ;
65   void      setMe(void *dialog, void *opaque,uint32_t line);
66   void      getMe(void);
67   void      finalize(void);
68   void      updateMe();
69   void      enable(uint32_t onoff) ;
70   int getRequiredLayout(void);
71 };
72 
73 static void cb_menu(void *w,void *p);
74 static void cb_menu2(void *w,void *p);
75 
76 
77 
diaElemToggle(bool * toggleValue,const char * toggleTitle,const char * tip)78 diaElemToggle::diaElemToggle(bool *toggleValue,const char *toggleTitle, const char *tip)
79   : diaElemToggleBase()
80 {
81   param=(void *)toggleValue;
82   paramTitle=toggleTitle;
83   this->tip=tip;
84   nbLink=0;
85 
86 }
87 
~diaElemToggle()88 diaElemToggle::~diaElemToggle()
89 {
90 
91 }
link(uint32_t onoff,diaElem * w)92 uint8_t   diaElemToggle::link(uint32_t onoff,diaElem *w)
93 {
94     ADM_assert(nbLink<MENU_MAX_lINK);
95     links[nbLink].onoff=onoff;
96     links[nbLink].widget=w;
97     nbLink++;
98     return 1;
99 }
setMe(void * dialog,void * opaque,uint32_t line)100 void diaElemToggle::setMe(void *dialog, void *opaque,uint32_t line)
101 {
102   GtkWidget *widget;
103 
104   widget = gtk_check_button_new_with_mnemonic (paramTitle);
105   gtk_widget_show (widget);
106   myWidget=(void *)widget;
107 
108   gtk_table_attach (GTK_TABLE (opaque), widget, 0, 2, line, line+1,
109                     (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
110                     (GtkAttachOptions) (0), 0, 0);
111   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), *(uint32_t *)param);
112   if(tip)
113   {
114       gtk_widget_set_tooltip_text (widget, tip);
115   }
116   g_signal_connect(widget, "toggled", G_CALLBACK(cb_menu), (void *) this);
117 }
getMe(void)118 void diaElemToggle::getMe(void)
119 {
120   GtkWidget *widget=(GtkWidget *)myWidget;
121   bool *val=(bool *)param;
122   ADM_assert(widget);
123   *(bool *)param=gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
124 }
finalize(void)125 void   diaElemToggle::finalize(void)
126 {
127   updateMe();
128 }
updateMe(void)129 void   diaElemToggle::updateMe(void)
130 {
131   GtkWidget *widget=(GtkWidget *)myWidget;
132   uint32_t val;
133   uint32_t rank;
134   if(!nbLink) return;
135   ADM_assert(widget);
136 
137 
138   rank=gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
139   /* Now search through the linked list to see if something happens ...*/
140 
141    /* 1 disable everything */
142   for(int i=0;i<nbLink;i++)
143   {
144     dialElemLink *l=&(links[i]);
145     l->widget->enable(0);
146   }
147   /* Then enable */
148   for(int i=0;i<nbLink;i++)
149   {
150       dialElemLink *l=&(links[i]);
151       if(l->onoff==rank)  l->widget->enable(1);
152   }
153 }
enable(uint32_t onoff)154 void   diaElemToggle::enable(uint32_t onoff)
155 {
156   gtk_widget_set_sensitive(GTK_WIDGET(myWidget),onoff);
157 }
158 
getRequiredLayout(void)159 int diaElemToggle::getRequiredLayout(void) { return 0; }
160 
161 //** C callback **
cb_menu(void * w,void * p)162 void cb_menu(void *w,void *p)
163 {
164   diaElemToggle *me=(diaElemToggle *)p;
165   me->updateMe();
166 }
167 //*************************************************************************
diaElemToggleUint(uint32_t * toggleValue,const char * toggleTitle,uint32_t * uintval,const char * name,uint32_t min,uint32_t max,const char * tip)168 diaElemToggleUint::diaElemToggleUint(uint32_t *toggleValue,const char *toggleTitle, uint32_t *uintval, const char *name,uint32_t min,uint32_t max,const char *tip)
169   : diaElem(ELEM_TOGGLE_UINT)
170 {
171   param=(void *)toggleValue;
172   paramTitle=toggleTitle;
173   this->tip=tip;
174   embName=name;
175   emb=uintval;
176   widgetUint=NULL;
177   _min=min;
178   _max=max;
179 }
180 
~diaElemToggleUint()181 diaElemToggleUint::~diaElemToggleUint()
182 {
183 
184 }
setMe(void * dialog,void * opaque,uint32_t line)185 void diaElemToggleUint::setMe(void *dialog, void *opaque,uint32_t line)
186 {
187   GtkWidget *widget,*widuint;
188 
189   widget = gtk_check_button_new_with_mnemonic (paramTitle);
190   gtk_widget_show (widget);
191   myWidget=(void *)widget;
192 
193   gtk_table_attach (GTK_TABLE (opaque), widget, 0, 1, line, line+1,
194                     (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
195                     (GtkAttachOptions) (0), 0, 0);
196   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), *(uint32_t *)param);
197   if(tip)
198   {
199       gtk_widget_set_tooltip_text (widget, tip);
200   }
201   g_signal_connect(widget, "toggled", G_CALLBACK(cb_menu2), (void *) this);
202   /* Now put uint */
203   widuint = gtk_spin_button_new_with_range(_min,_max,1);
204   gtk_spin_button_set_numeric (GTK_SPIN_BUTTON(widuint),TRUE);
205   gtk_spin_button_set_digits  (GTK_SPIN_BUTTON(widuint),0);
206   gtk_spin_button_set_value (GTK_SPIN_BUTTON(widuint),*emb);
207 
208   gtk_widget_show (widuint);
209 
210   gtk_table_attach (GTK_TABLE (opaque), widuint, 1, 2, line, line+1,
211                     (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
212                     (GtkAttachOptions) (0), 0, 0);
213 
214   widgetUint=widuint;
215 
216 }
getMe(void)217 void diaElemToggleUint::getMe(void)
218 {
219   GtkWidget *widget=(GtkWidget *)myWidget;
220   uint32_t *val=(uint32_t *)param;
221   ADM_assert(widget);
222   *(uint32_t *)param=gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
223   *emb=gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON ((GtkWidget *)widgetUint));
224   if(*emb<_min) *emb=_min;
225   if(*emb>_max) *emb=_max;
226 }
finalize(void)227 void   diaElemToggleUint::finalize(void)
228 {
229   updateMe();
230 }
updateMe(void)231 void   diaElemToggleUint::updateMe(void)
232 {
233   GtkWidget *widget=(GtkWidget *)myWidget;
234   GtkWidget *wuint=(GtkWidget *)widgetUint;
235   uint32_t val;
236   uint32_t rank;
237   ADM_assert(widget);
238 
239 
240   rank=gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
241   gtk_widget_set_sensitive(GTK_WIDGET(wuint),rank);
242 
243 }
enable(uint32_t onoff)244 void   diaElemToggleUint::enable(uint32_t onoff)
245 {
246    GtkWidget *widget=(GtkWidget *)myWidget;
247   GtkWidget *wuint=(GtkWidget *)widgetUint;
248 
249   gtk_widget_set_sensitive(GTK_WIDGET(widget),onoff);
250   gtk_widget_set_sensitive(GTK_WIDGET(wuint),onoff);
251 }
252 
getRequiredLayout(void)253 int diaElemToggleUint::getRequiredLayout(void) { return 0; }
254 
255 //** C callback **
cb_menu2(void * w,void * p)256 void cb_menu2(void *w,void *p)
257 {
258   diaElemToggleUint *me=(diaElemToggleUint *)p;
259   me->updateMe();
260 }
261 //*************************************************************************
diaElemToggleInt(uint32_t * toggleValue,const char * toggleTitle,int32_t * uintval,const char * name,int32_t min,int32_t max,const char * tip)262 diaElemToggleInt::diaElemToggleInt(uint32_t *toggleValue,const char *toggleTitle, int32_t *uintval, const char *name,int32_t min,int32_t max,const char *tip)
263   : diaElem(ELEM_TOGGLE_INT)
264 {
265   param=(void *)toggleValue;
266   paramTitle=toggleTitle;
267   this->tip=tip;
268   embName=name;
269   emb=uintval;
270   widgetUint=NULL;
271   _min=min;
272   _max=max;
273 }
274 
~diaElemToggleInt()275 diaElemToggleInt::~diaElemToggleInt()
276 {
277 
278 }
setMe(void * dialog,void * opaque,uint32_t line)279 void diaElemToggleInt::setMe(void *dialog, void *opaque,uint32_t line)
280 {
281   GtkWidget *widget,*widuint;
282 
283   widget = gtk_check_button_new_with_mnemonic (paramTitle);
284   gtk_widget_show (widget);
285   myWidget=(void *)widget;
286 
287   gtk_table_attach (GTK_TABLE (opaque), widget, 0, 1, line, line+1,
288                     (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
289                     (GtkAttachOptions) (0), 0, 0);
290   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), *(uint32_t *)param);
291   if(tip)
292   {
293       gtk_widget_set_tooltip_text (widget, tip);
294   }
295   g_signal_connect(widget, "toggled", G_CALLBACK(cb_menu2), (void *) this);
296   /* Now put uint */
297   widuint = gtk_spin_button_new_with_range(_min,_max,1);
298   gtk_spin_button_set_numeric (GTK_SPIN_BUTTON(widuint),TRUE);
299   gtk_spin_button_set_digits  (GTK_SPIN_BUTTON(widuint),0);
300   gtk_spin_button_set_value (GTK_SPIN_BUTTON(widuint),*emb);
301 
302   gtk_widget_show (widuint);
303 
304   gtk_table_attach (GTK_TABLE (opaque), widuint, 1, 2, line, line+1,
305                     (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
306                     (GtkAttachOptions) (0), 0, 0);
307 
308   widgetUint=widuint;
309 
310 }
getMe(void)311 void diaElemToggleInt::getMe(void)
312 {
313   GtkWidget *widget=(GtkWidget *)myWidget;
314   uint32_t *val=(uint32_t *)param;
315   ADM_assert(widget);
316   *(uint32_t *)param=gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
317   *emb=gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON ((GtkWidget *)widgetUint));
318   if(*emb<_min) *emb=_min;
319   if(*emb>_max) *emb=_max;
320 }
321 
getRequiredLayout(void)322 int diaElemToggleInt::getRequiredLayout(void) { return 0; }
323 
324 //** C callback **
cb_menu3(void * w,void * p)325 void cb_menu3(void *w,void *p)
326 {
327   diaElemToggleInt *me=(diaElemToggleInt *)p;
328   me->updateMe();
329 }
updateMe(void)330 void   diaElemToggleInt::updateMe(void)
331 {
332   GtkWidget *widget=(GtkWidget *)myWidget;
333   GtkWidget *wuint=(GtkWidget *)widgetUint;
334   uint32_t val;
335   uint32_t rank;
336   ADM_assert(widget);
337 
338 
339   rank=gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
340   gtk_widget_set_sensitive(GTK_WIDGET(wuint),rank);
341 
342 }
finalize(void)343 void   diaElemToggleInt::finalize(void)
344 {
345   updateMe();
346 }
enable(uint32_t onoff)347 void   diaElemToggleInt::enable(uint32_t onoff)
348 {
349    GtkWidget *widget=(GtkWidget *)myWidget;
350   GtkWidget *wuint=(GtkWidget *)widgetUint;
351 
352   gtk_widget_set_sensitive(GTK_WIDGET(widget),onoff);
353   gtk_widget_set_sensitive(GTK_WIDGET(wuint),onoff);
354 }
355 
356 } // End of namespace
357 //****************************Hoook*****************
358 
gtkCreateToggleUint(uint32_t * toggleValue,const char * toggleTitle,uint32_t * uintval,const char * name,uint32_t min,uint32_t max,const char * tip)359 diaElem  *gtkCreateToggleUint(uint32_t *toggleValue,const char *toggleTitle, uint32_t *uintval,
360 		const char *name,uint32_t min,uint32_t max,const char *tip)
361 {
362 	return new  ADM_GtkFactory::diaElemToggleUint(toggleValue,toggleTitle, uintval,
363 			name,min,max,tip);
364 }
gtkDestroyToggleUint(diaElem * e)365 void gtkDestroyToggleUint(diaElem *e)
366 {
367 	ADM_GtkFactory::diaElemToggleUint *a=(ADM_GtkFactory::diaElemToggleUint *)e;
368 	delete a;
369 }
370 
gtkCreateToggleInt(uint32_t * toggleValue,const char * toggleTitle,int32_t * uintval,const char * name,int32_t min,int32_t max,const char * tip)371 diaElem  *gtkCreateToggleInt(uint32_t *toggleValue,const char *toggleTitle, int32_t *uintval,
372 		const char *name,int32_t min,int32_t max,const char *tip)
373 {
374 	return new  ADM_GtkFactory::diaElemToggleInt(toggleValue,toggleTitle, uintval,
375 			name,min,max,tip);
376 }
gtkDestroyToggleInt(diaElem * e)377 void gtkDestroyToggleInt(diaElem *e)
378 {
379 	ADM_GtkFactory::diaElemToggleInt *a=(ADM_GtkFactory::diaElemToggleInt *)e;
380 	delete a;
381 }
gtkCreateToggle(bool * toggleValue,const char * toggleTitle,const char * tip)382 diaElem  *gtkCreateToggle(bool *toggleValue,const char *toggleTitle, const char *tip)
383 {
384 	return new  ADM_GtkFactory::diaElemToggle(toggleValue,toggleTitle, tip);
385 }
gtkDestroyToggle(diaElem * e)386 void gtkDestroyToggle(diaElem *e)
387 {
388 	ADM_GtkFactory::diaElemToggle *a=(ADM_GtkFactory::diaElemToggle *)e;
389 	delete a;
390 }
391 
392 
393 //EOF
394