1 /***************************************************************************
2   FAC_toggle.cpp
3   Handle dialog factory element : Menu
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 namespace ADM_GtkFactory
19 {
20 static void cb_menu(void *w,void *p);
21 static void cb_menus(void *w,void *p);
22 
23 
24 class diaElemMenuDynamic : public diaElemMenuDynamicBase
25 {
26 protected:
27 
28 
29 public:
30   diaElemMenuDynamic(uint32_t *intValue,const char *itle, uint32_t nb,
31                diaMenuEntryDynamic **menu,const char *tip=NULL);
32 
33   virtual   ~diaElemMenuDynamic() ;
34   void      setMe(void *dialog, void *opaque,uint32_t line);
35   void      getMe(void);
36   virtual uint8_t   link(diaMenuEntryDynamic *entry,uint32_t onoff,diaElem *w);
37   virtual void      updateMe(void);
38   virtual void      enable(uint32_t onoff) ;
39   virtual void      finalize(void);
40   int getRequiredLayout(void);
41 };
42 //**********************
43 class diaElemMenu : public diaElemMenuBase
44 {
45 protected:
46 
47 
48 	diaElemMenuDynamic  *dyna;
49 	diaMenuEntryDynamic  **menus;
50 public:
51   diaElemMenu(uint32_t *intValue,const char *itle, uint32_t nb,
52                const diaMenuEntry *menu,const char *tip=NULL);
53 
54   virtual ~diaElemMenu() ;
55   void setMe(void *dialog, void *opaque,uint32_t line);
56   void getMe(void);
57   virtual uint8_t   link(diaMenuEntry *entry,uint32_t onoff,diaElem *w);
58   virtual void      updateMe(void);
59   void      enable(uint32_t onoff) ;
60   void      finalize(void);
61   int getRequiredLayout(void);
62 };
63 //**********************
diaElemMenu(uint32_t * intValue,const char * itle,uint32_t nb,const diaMenuEntry * menu,const char * tip)64 diaElemMenu::diaElemMenu(uint32_t *intValue,const char *itle, uint32_t nb,
65                const diaMenuEntry *menu,const char *tip)
66   : diaElemMenuBase()
67 {
68   param=(void *)intValue;
69   paramTitle=itle;
70   this->tip=tip;
71   this->menu=menu;
72   this->nbMenu=nb;
73   nbLink=0;
74 
75   menus=new diaMenuEntryDynamic * [nb];
76   for(int i=0;i<nb;i++)
77   {
78     menus[i]=new  diaMenuEntryDynamic(menu[i].val,menu[i].text,menu[i].desc);
79   }
80   dyna=new diaElemMenuDynamic(intValue,itle,nb,menus,tip);
81 }
82 
~diaElemMenu()83 diaElemMenu::~diaElemMenu()
84 {
85   for(int i=0;i<nbMenu;i++)
86       delete menus[i];
87   delete [] menus;
88   delete dyna;
89 
90 }
setMe(void * dialog,void * opaque,uint32_t line)91 void diaElemMenu::setMe(void *dialog, void *opaque,uint32_t line)
92 {
93   dyna->setMe(dialog,opaque,line);
94 }
95 
getMe(void)96 void diaElemMenu::getMe(void)
97 {
98  dyna->getMe();
99 }
updateMe(void)100 void   diaElemMenu::updateMe(void)
101 {
102   dyna->updateMe();
103 }
link(diaMenuEntry * entry,uint32_t onoff,diaElem * w)104 uint8_t   diaElemMenu::link(diaMenuEntry *entry,uint32_t onoff,diaElem *w)
105 {
106     for(int i=0;i<nbMenu;i++)
107     {
108         if(entry->val==menus[i]->val)
109             return dyna->link(menus[i],onoff,w);
110     }
111     ADM_assert(0);
112 }
enable(uint32_t onoff)113 void   diaElemMenu::enable(uint32_t onoff)
114 {
115   dyna->enable(onoff);
116 }
finalize(void)117 void   diaElemMenu::finalize(void)
118 {
119   dyna->finalize();
120 }
121 
getRequiredLayout(void)122 int diaElemMenu::getRequiredLayout(void) { return 0; }
123 
124 //*******************************
diaElemMenuDynamic(uint32_t * intValue,const char * itle,uint32_t nb,diaMenuEntryDynamic ** menu,const char * tip)125 diaElemMenuDynamic::diaElemMenuDynamic(uint32_t *intValue,const char *itle, uint32_t nb,
126                 diaMenuEntryDynamic **menu,const char *tip)
127   : diaElemMenuDynamicBase()
128 {
129   param=(void *)intValue;
130   paramTitle=itle;
131   this->tip=tip;
132   this->menu=menu;
133   this->nbMenu=nb;
134   nbLink=0;
135 }
136 
~diaElemMenuDynamic()137 diaElemMenuDynamic::~diaElemMenuDynamic()
138 {
139 
140 }
setMe(void * dialog,void * opaque,uint32_t line)141 void diaElemMenuDynamic::setMe(void *dialog, void *opaque,uint32_t line)
142 {
143   GtkWidget *widget;
144   GtkWidget *label;
145   GtkWidget *item;
146   GtkWidget *combo;
147 
148 
149   label = gtk_label_new_with_mnemonic (paramTitle);
150   gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
151   gtk_widget_show(label);
152 
153   gtk_table_attach (GTK_TABLE (opaque), label, 0, 1, line, line+1,
154                     (GtkAttachOptions) (GTK_FILL),
155                     (GtkAttachOptions) (0), 0, 0);
156 
157   combo = gtk_combo_box_text_new ();
158   gtk_widget_show (combo);
159   gtk_table_attach (GTK_TABLE (opaque), combo, 1, 2, line, line+1,
160                     (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
161                     (GtkAttachOptions) (0), 0, 0);
162 
163   gtk_label_set_mnemonic_widget (GTK_LABEL(label), combo);
164 
165   for(int i=0;i<nbMenu;i++)
166   {
167     gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo), menu[i]->text);
168   }
169 
170   for(int i=0;i<nbMenu;i++)
171   {
172     if(menu[i]->val==*(uint32_t *)param)
173     {
174       gtk_combo_box_set_active(GTK_COMBO_BOX(combo),i);
175     }
176   }
177   myWidget=(void *)combo;
178   g_signal_connect(combo, "changed", G_CALLBACK(cb_menu), (void *) this);
179 
180 }
181 
getMe(void)182 void diaElemMenuDynamic::getMe(void)
183 {
184   GtkWidget *widget=(GtkWidget *)myWidget;
185   uint32_t *val=(uint32_t *)param;
186   uint32_t rank;
187   if(!nbMenu) return;
188   ADM_assert(widget);
189 
190 
191   rank=gtk_combo_box_get_active(GTK_COMBO_BOX(widget));
192   if(-1==rank) rank=0;
193   ADM_assert(rank<this->nbMenu);
194   *(uint32_t *)param=this->menu[rank]->val;
195 }
196 
link(diaMenuEntryDynamic * entry,uint32_t onoff,diaElem * w)197 uint8_t   diaElemMenuDynamic::link(diaMenuEntryDynamic *entry,uint32_t onoff,diaElem *w)
198 {
199     ADM_assert(nbLink<MENU_MAX_lINK);
200     links[nbLink].value=entry->val;
201     links[nbLink].onoff=onoff;
202     links[nbLink].widget=w;
203     nbLink++;
204     return 1;
205 }
206 
updateMe(void)207 void   diaElemMenuDynamic::updateMe(void)
208 {
209   GtkWidget *widget=(GtkWidget *)myWidget;
210   uint32_t val;
211   uint32_t rank;
212   if(!nbMenu) return;
213   ADM_assert(widget);
214 
215 
216   rank=gtk_combo_box_get_active(GTK_COMBO_BOX(widget));
217   if(-1==rank) rank=0;
218   ADM_assert(rank<this->nbMenu);
219   val=this->menu[rank]->val;
220   /* Now search through the linked list to see if something happens ...*/
221 
222    /* 1 disable everything */
223   for(int i=0;i<nbLink;i++)
224   {
225     dialElemLink *l=&(links[i]);
226     if(l->value==val)
227     {
228       if(!l->onoff)  l->widget->enable(0);
229     }else
230     {
231        if(l->onoff)  l->widget->enable(0);
232     }
233 
234   }
235   /* Then enable */
236   for(int i=0;i<nbLink;i++)
237   {
238     dialElemLink *l=&(links[i]);
239     if(l->value==val)
240     {
241       if(l->onoff)  l->widget->enable(1);
242     }else
243     {
244        if(!l->onoff)  l->widget->enable(1);
245     }
246 
247   }
248 }
finalize(void)249 void   diaElemMenuDynamic::finalize(void)
250 {
251   updateMe();
252 }
enable(uint32_t onoff)253 void   diaElemMenuDynamic::enable(uint32_t onoff)
254 {
255   gtk_widget_set_sensitive(GTK_WIDGET(myWidget),onoff);
256 }
257 
getRequiredLayout(void)258 int diaElemMenuDynamic::getRequiredLayout(void) { return 0; }
259 
260 //** C callback **
cb_menu(void * w,void * p)261 void cb_menu(void *w,void *p)
262 {
263   diaElemMenuDynamic *me=(diaElemMenuDynamic *)p;
264   me->updateMe();
265 }
cb_menus(void * w,void * p)266 void cb_menus(void *w,void *p)
267 {
268   diaElemMenu *me=(diaElemMenu *)p;
269   me->updateMe();
270 }
271 //********************
272 }; // End of namespace
273 
gtkCreateMenu(uint32_t * intValue,const char * itle,uint32_t nb,const diaMenuEntry * menu,const char * tip)274 diaElem  *gtkCreateMenu(uint32_t *intValue,const char *itle, uint32_t nb,         const diaMenuEntry *menu,const char *tip)
275 {
276 	return new  ADM_GtkFactory::diaElemMenu(intValue,itle,nb,menu,tip);
277 }
gtkDestroyMenu(diaElem * e)278 void gtkDestroyMenu(diaElem *e)
279 {
280 	ADM_GtkFactory::diaElemMenu *a=(ADM_GtkFactory::diaElemMenu *)e;
281 	delete a;
282 }
gtkCreateMenuDynamic(uint32_t * intValue,const char * itle,uint32_t nb,diaMenuEntryDynamic ** menu,const char * tipp)283 diaElem  *gtkCreateMenuDynamic(uint32_t *intValue,const char *itle, uint32_t nb,
284         diaMenuEntryDynamic **menu,const char *tipp)
285 {
286 	return new  ADM_GtkFactory::diaElemMenuDynamic(intValue,itle,nb,menu,tipp);
287 }
gtkDestroyMenuDynamic(diaElem * e)288 void gtkDestroyMenuDynamic(diaElem *e)
289 {
290 	ADM_GtkFactory::diaElemMenuDynamic *a=(ADM_GtkFactory::diaElemMenuDynamic *)e;
291 	delete a;
292 }
293 
294 //EOF
295