1 /***************************************************************************
2   DIA_dialogFactory.cpp
3   (C) 2006 Mean Fixounet@free.fr
4 ***************************************************************************/
5 
6 /***************************************************************************
7  *                                                                         *
8  *   This program is free software; you can redistribute it and/or modify  *
9  *   it under the terms of the GNU General Public License as published by  *
10  *   the Free Software Foundation; either version 2 of the License, or     *
11  *   (at your option) any later version.                                   *
12  *                                                                         *
13  ***************************************************************************/
14 
15 #include "ADM_toolkitGtk.h"
16 #include "DIA_factory.h"
17 #include "DIA_coreToolkit.h"
18 #include "DIA_coreUI_internal.h"
19 
20 static uint8_t  buildOneTab(GtkWidget *nb,int index, diaElemTabs *tab);
21 static uint8_t  readOneTab(int index, diaElemTabs *tab);
22 //
23 static uint8_t gtkDiaFactoryRunTabs(const char *title,uint32_t nb,diaElemTabs **tabs);
24 static uint8_t gtkDiaFactoryRun(const char *title,uint32_t nb,diaElem **elems);
25 //
26 
27 /**
28     \fn addLine(diaElem *elem, GtkDialog *dialog, GtkWidget *vbox)
29     \brief setup an line with the element given as parameter
30     @return nothing
31 
32 */
addLine(diaElem * elem,GtkWidget * dialog,GtkWidget * vbox,uint32_t line)33 void addLine(diaElem *elem, GtkWidget *dialog, GtkWidget *vbox,uint32_t line)
34 {
35             elem->setMe( (void *)dialog,(void *)vbox,line);
36 
37 }
38 /**
39     \fn getLine(diaElem *elem, GtkDialog *dialog, GtkWidget *vbox)
40     \brief read back an line with the element given as parameter
41     @return nothing
42 
43 */
getLine(diaElem * elem,GtkWidget * dialog,GtkWidget * vbox,uint32_t line)44 void getLine(diaElem *elem, GtkWidget *dialog, GtkWidget *vbox,uint32_t line)
45 {
46 
47              elem->getMe();
48 
49 }
50 /**
51     \fn diaFactoryRun(const char *title,uint32_t nb,diaElem **elems)
52     \brief  Run a dialog made of nb elems, each elem being described in the **elems
53     @return 0 on failure, 1 on success
54 */
55 
gtkDiaFactoryRun(const char * title,uint32_t nb,diaElem ** elems)56 uint8_t gtkDiaFactoryRun(const char *title,uint32_t nb,diaElem **elems)
57 {
58   uint8_t ret=0;
59   ADM_assert(elems);
60   ADM_assert(nb);
61   ADM_assert(title);
62 
63   /* First there was a dialog ...*/
64   GtkWidget *dialog=gtk_dialog_new ();
65   GtkWidget *dialog_vbox1;
66   GtkWidget *table1;
67   GtkWidget *vbox1;
68 
69   gtk_window_set_title (GTK_WINDOW (dialog),title );
70   gtk_window_set_resizable (GTK_WINDOW (dialog), FALSE);
71   gtk_container_set_border_width (GTK_CONTAINER (dialog), 6);
72   dialog_vbox1 = gtk_dialog_get_content_area (GTK_DIALOG (dialog));
73   gtk_box_set_spacing (GTK_BOX(dialog_vbox1), 12);
74   gtk_widget_show (dialog_vbox1);
75 
76   vbox1 = gtk_vbox_new (0, 18);
77   gtk_container_set_border_width (GTK_CONTAINER (vbox1), 6);
78   gtk_container_add (GTK_CONTAINER (dialog_vbox1), vbox1);
79   gtk_widget_show (vbox1);
80 
81   int line=0;
82   int i=0;
83   while (i<nb)
84   {
85 	  if (elems[i]->mySelf == ELEM_FRAME)
86 	  {
87 		  addLine(elems[i],dialog,vbox1,line);
88 		  i++;
89 	  }
90 	  else
91 	  {
92 		  line = 0;
93 		  int nbLine=0;
94 		  while (i+nbLine<nb && elems[i+nbLine]->mySelf != ELEM_FRAME)
95 			  nbLine++;
96 		  table1 = gtk_table_new (nbLine, 2, FALSE);
97 		  gtk_table_set_col_spacings (GTK_TABLE (table1), 12);
98 		  gtk_table_set_row_spacings (GTK_TABLE (table1), 6);
99 		  gtk_box_pack_start (GTK_BOX(vbox1), table1, FALSE, FALSE, 0);
100 		  gtk_widget_show (table1);
101 
102 		  while (i<nb && elems[i]->mySelf != ELEM_FRAME)
103 		  {
104 			  addLine(elems[i],dialog,table1,line);
105 			  line+=elems[i]->getSize();
106 			  i++;
107 		  }
108 	  }
109   }
110 
111   // Add a Close button
112   GtkWidget *okbutton1;
113   GtkWidget *cancelbutton1;
114 
115   cancelbutton1 = gtk_button_new_from_stock ("gtk-cancel");
116   gtk_widget_show (cancelbutton1);
117   gtk_dialog_add_action_widget (GTK_DIALOG (dialog), cancelbutton1, GTK_RESPONSE_CANCEL);
118 
119   okbutton1 = gtk_button_new_from_stock ("gtk-ok");
120   gtk_widget_show (okbutton1);
121   gtk_dialog_add_action_widget (GTK_DIALOG (dialog), okbutton1, GTK_RESPONSE_OK);
122   gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK);
123 
124   gtk_dialog_set_alternative_button_order(GTK_DIALOG(dialog),
125 										GTK_RESPONSE_OK,
126 										GTK_RESPONSE_CANCEL,
127 										-1);
128 
129   /* Finalize them */
130   for(int i=0;i<nb;i++)
131   {
132     elems[i]->finalize();
133   }
134 
135   // Show it & run
136   gtk_register_dialog(dialog);
137   if(GTK_RESPONSE_OK==gtk_dialog_run(GTK_DIALOG(dialog)))
138   {
139     for(int i=0;i<nb;i++)
140       {
141         getLine(elems[i],dialog,table1,i);
142 
143       }
144     ret=1;
145   }
146 
147   // Cleanup
148   gtk_unregister_dialog(dialog);
149   gtk_widget_destroy(dialog);
150   return ret;
151 }
152 /**
153     \fn   diaFactoryRun
154     \brief   Same as above but for tabbed dialog
155 */
gtkDiaFactoryRunTabs(const char * title,uint32_t nb,diaElemTabs ** tabs)156 uint8_t gtkDiaFactoryRunTabs(const char *title,uint32_t nb,diaElemTabs **tabs)
157 {
158   uint8_t ret=0;
159   ADM_assert(tabs);
160   ADM_assert(nb);
161   ADM_assert(title);
162 
163   /* First there was a dialog ...*/
164   GtkWidget *dialog=gtk_dialog_new ();
165   GtkWidget *dialog_vbox1;
166   GtkWidget *table1;
167   GtkWidget *notebook1;
168 
169   gtk_window_set_title (GTK_WINDOW (dialog),title );
170   gtk_window_set_resizable (GTK_WINDOW (dialog), FALSE);
171   gtk_container_set_border_width (GTK_CONTAINER (dialog), 6);
172   dialog_vbox1 = gtk_dialog_get_content_area (GTK_DIALOG (dialog));
173   gtk_box_set_spacing (GTK_BOX(dialog_vbox1), 12);
174   gtk_widget_show (dialog_vbox1);
175    // Ok  create our tabs
176   notebook1 = gtk_notebook_new ();
177   gtk_widget_show (notebook1);
178   gtk_box_pack_start (GTK_BOX (dialog_vbox1), notebook1, FALSE, FALSE, 0);
179   gtk_container_set_border_width (GTK_CONTAINER (notebook1), 6);
180 
181   // And fill them
182   for(int i=0;i<nb;i++)
183   {
184     buildOneTab(notebook1,i,tabs[i]);
185   }
186 
187   diaElemTabs *itab;
188   for(int i=0;i<nb;i++)
189   {
190     itab=(tabs[i]);
191     for(int j=0;j<itab->nbElems;j++)
192     {
193       itab->dias[j]->finalize();
194     }
195   }
196   // Add a Close button
197   GtkWidget *okbutton1;
198   GtkWidget *cancelbutton1;
199 
200   cancelbutton1 = gtk_button_new_from_stock ("gtk-cancel");
201   gtk_widget_show (cancelbutton1);
202   gtk_dialog_add_action_widget (GTK_DIALOG (dialog), cancelbutton1, GTK_RESPONSE_CANCEL);
203 
204   okbutton1 = gtk_button_new_from_stock ("gtk-ok");
205   gtk_widget_show (okbutton1);
206   gtk_dialog_add_action_widget (GTK_DIALOG (dialog), okbutton1, GTK_RESPONSE_OK);
207   gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK);
208 
209   gtk_dialog_set_alternative_button_order(GTK_DIALOG(dialog),
210 										GTK_RESPONSE_OK,
211 										GTK_RESPONSE_CANCEL,
212 										-1);
213 
214   // Show it & run
215   gtk_register_dialog(dialog);
216   if(GTK_RESPONSE_OK==gtk_dialog_run(GTK_DIALOG(dialog)))
217   {
218     for(int i=0;i<nb;i++)
219     {
220       readOneTab(i,tabs[i]);
221     }
222     ret=1;
223   }
224 
225   // Cleanup
226   gtk_unregister_dialog(dialog);
227   gtk_widget_destroy(dialog);
228   return ret;
229 }
230 /**
231 
232 */
buildOneTab(GtkWidget * nb,int index,diaElemTabs * tab)233 uint8_t  buildOneTab(GtkWidget *nb,int index, diaElemTabs *tab)
234 {
235   GtkWidget *table1,*vbox1,*label;
236 
237   ADM_assert(tab);
238   vbox1 = gtk_vbox_new (0, 18);
239   gtk_container_set_border_width (GTK_CONTAINER (vbox1), 12);
240   gtk_container_add (GTK_CONTAINER (nb), vbox1);
241   gtk_widget_show (vbox1);
242 
243   int line=0;
244   int i=0;
245   while (i<tab->nbElems)
246   {
247 	  if (tab->dias[i]->mySelf == ELEM_FRAME)
248 	  {
249 		  addLine(tab->dias[i],nb,vbox1,line);
250 		  i++;
251 	  }
252 	  else
253 	  {
254                   line = 0;
255                   int nbLine=0;
256                    while (i+nbLine<tab->nbElems && tab->dias[i+nbLine]->mySelf != ELEM_FRAME)
257                     nbLine++;
258                   table1 = gtk_table_new (nbLine, 2, FALSE);
259                   gtk_table_set_col_spacings (GTK_TABLE (table1), 12);
260                   gtk_table_set_row_spacings (GTK_TABLE (table1), 6);
261                   gtk_box_pack_start (GTK_BOX(vbox1), table1, FALSE, FALSE, 0);
262                   gtk_widget_show (table1);
263 
264                   while (i<tab->nbElems && tab->dias[i]->mySelf != ELEM_FRAME)
265                   {
266                           addLine(tab->dias[i],nb,table1,line);
267 						  line+=tab->dias[i]->getSize();
268 						  i++;
269                   }
270 	  }
271   }
272 
273 
274 
275   label = gtk_label_new (tab->title);
276   gtk_widget_show (label);
277   gtk_notebook_set_tab_label (GTK_NOTEBOOK (nb), gtk_notebook_get_nth_page (GTK_NOTEBOOK (nb), index), label);
278 
279 
280 
281   return 1;
282 }
283 /**
284 
285 */
readOneTab(int index,diaElemTabs * tab)286 uint8_t  readOneTab(int index, diaElemTabs *tab)
287 {
288   for(int i=0;i<tab->nbElems;i++)
289   {
290     tab->dias[i]->getMe();
291   }
292   return 1;
293 }
294 
295 
296 //*****************HOOK************
297 /**
298  * 	\fn InitFactory
299  *  \brief Install hoook for dialogFactory
300  * */
301 extern diaElem  *gtkCreateButton(const char *toggleTitle, ADM_FAC_CALLBACK *cb,void *cookie,const char *tip);
302 extern void 	gtkDeleteButton(diaElem *e);
303 extern diaElem  *gtkCreateBar(uint32_t percent,const char *toggleTitle);
304 extern void     gtkDeleteBar(diaElem *e);
305 extern diaElem  *gtkCreateFloat(ELEM_TYPE_FLOAT *intValue,const char *toggleTitle, ELEM_TYPE_FLOAT min, ELEM_TYPE_FLOAT max,const char *tip, int decimals);
306 extern void     gtkDeleteFloat(diaElem *e);
307 extern CREATE_INTEGER_T  gtkCreateInteger;
308 extern CREATE_UINTEGER_T gtkCreateUInteger;
309 extern DELETE_DIA_ELEM_T gtkDestroyInteger;
310 extern DELETE_DIA_ELEM_T gtkDestroyUInteger;
311 extern CREATE_NOTCH_T    gtkCreateNotch;
312 extern DELETE_DIA_ELEM_T   gtkDestroyNotch;
313 extern CREATE_READONLYTEXT_T gtkCreateRoText;
314 extern CREATE_TEXT_T gtkCreateText;
315 extern DELETE_DIA_ELEM_T   gtkDestroyRoText;
316 extern DELETE_DIA_ELEM_T   gtkDestroyText;
317 extern CREATE_HEX_T        gtkCreateHex;
318 extern DELETE_DIA_ELEM_T   gtkDestroyHex;
319 extern CREATE_MATRIX_T     gtkCreateMatrix;
320 extern DELETE_DIA_ELEM_T   gtkDestroyMatrix;
321 extern CREATE_MENUDYNAMIC_T     gtkCreateMenuDynamic;
322 extern CREATE_MENU_T       gtkCreateMenu;
323 extern DELETE_DIA_ELEM_T   gtkDestroyMenu;
324 extern DELETE_DIA_ELEM_T   gtkDestroyMenuDynamic;
325 extern CREATE_THREADCOUNT_T gtkCreateThreadCount;
326 extern DELETE_DIA_ELEM_T    gtkDestroyThreadCount;
327 extern CREATE_BITRATE_T     gtkCreateBitrate;
328 extern DELETE_DIA_ELEM_T    gtkDestroyBitrate;
329 extern CREATE_FILE_T        gtkCreateFile;
330 extern DELETE_DIA_ELEM_T    gtkDestroyFile;
331 extern CREATE_DIR_T         gtkCreateDir;
332 extern DELETE_DIA_ELEM_T    gtkDestroyDir;
333 extern CREATE_FRAME_T		gtkCreateFrame;
334 extern DELETE_DIA_ELEM_T    gtkDestroyFrame;
335 extern CREATE_TOGGLE_UINT   gtkCreateToggleUint;
336 extern DELETE_DIA_ELEM_T    gtkDestroyToggleUint;
337 extern CREATE_TOGGLE_INT    gtkCreateToggleInt;
338 extern DELETE_DIA_ELEM_T    gtkDestroyToggleInt;
339 extern CREATE_TOGGLE_T      gtkCreateToggle;
340 extern DELETE_DIA_ELEM_T    gtkDestroyToggle;
341 extern CREATE_USLIDER_T     gtkCreateUSlider;
342 extern DELETE_DIA_ELEM_T    gtkDestroyUSlider;
343 extern CREATE_SLIDER_T      gtkCreateSlider;
344 extern DELETE_DIA_ELEM_T    gtkDestroySlider;
345 extern CREATE_TIMESTAMP_T   gtkCreateTimeStamp;
346 extern DELETE_DIA_ELEM_T    gtkDestroyTimeStamp;
347 
348 /**
349  *  \fn gtkFactoryGetVersion
350  * 	\brief returns the version this has been compiled with
351  */
gtkFactoryGetVersion(uint32_t * maj,uint32_t * minor,uint32_t * patch)352 void      gtkFactoryGetVersion(uint32_t *maj,uint32_t *minor,uint32_t *patch)
353 {
354 	*maj=ADM_COREUI_MAJOR;
355 	*minor=ADM_COREUI_MINOR;
356 	*patch=ADM_COREUI_PATCH;
357 
358 }
359 //************
360 static FactoryDescriptor GtkFactoryDescriptor=
361 {
362 	&gtkFactoryGetVersion,
363 	&gtkDiaFactoryRun,
364 	&gtkDiaFactoryRunTabs,
365 	// Buttons
366 	&gtkCreateButton,
367 	&gtkDeleteButton,
368 	// Bar
369 	&gtkCreateBar,
370 	&gtkDeleteBar,
371 	// Float
372 	&gtkCreateFloat,
373 	&gtkDeleteFloat,
374 	// Integer
375 	&gtkCreateInteger,
376 	&gtkDestroyInteger,
377 	// UInteger
378 	&gtkCreateUInteger,
379 	&gtkDestroyUInteger,
380 	// Notch
381 	&gtkCreateNotch,
382 	&gtkDestroyNotch,
383 	// RoText
384 	&gtkCreateRoText,
385 	&gtkDestroyRoText,
386 	// Text
387 	&gtkCreateText,
388 	&gtkDestroyText,
389 	// Hex
390 	&gtkCreateHex,
391 	&gtkDestroyHex,
392 	// Matrix
393 	&gtkCreateMatrix,
394 	&gtkDestroyMatrix,
395 	// Menu
396 	&gtkCreateMenu,
397 	&gtkDestroyMenu,
398 	&gtkCreateMenuDynamic,
399 	&gtkDestroyMenuDynamic,
400 	// ThreadCount
401 	&gtkCreateThreadCount,
402 	&gtkDestroyThreadCount,
403 	// Bitrate
404 	&gtkCreateBitrate,
405 	&gtkDestroyBitrate,
406 	// File
407 	&gtkCreateFile,
408 	&gtkDestroyFile,
409 	// Dir
410 	&gtkCreateDir,
411 	&gtkDestroyDir,
412 	// Frame
413 	&gtkCreateFrame,
414 	&gtkDestroyFrame,
415     // Toggle uint/int
416 	&gtkCreateToggleUint,
417 	&gtkDestroyToggleUint,
418 	&gtkCreateToggleInt,
419 	&gtkDestroyToggleInt,
420 	// Regular toggle
421 	&gtkCreateToggle,
422 	&gtkDestroyToggle,
423 	// Slider
424 	&gtkCreateUSlider,
425 	&gtkDestroyUSlider,
426 	&gtkCreateSlider,
427 	&gtkDestroySlider,
428         &gtkCreateTimeStamp,
429         &gtkDestroyTimeStamp
430 
431 };
432 
433 /**
434  * 	\fn InitFactory
435  *  \brief Install our factory hooks
436  */
InitFactory(void)437 void InitFactory(void)
438 {
439 	DIA_factoryInit(&GtkFactoryDescriptor);
440 
441 
442 }
443 
444 //EOF
445