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