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 >kFactoryGetVersion,
363 >kDiaFactoryRun,
364 >kDiaFactoryRunTabs,
365 // Buttons
366 >kCreateButton,
367 >kDeleteButton,
368 // Bar
369 >kCreateBar,
370 >kDeleteBar,
371 // Float
372 >kCreateFloat,
373 >kDeleteFloat,
374 // Integer
375 >kCreateInteger,
376 >kDestroyInteger,
377 // UInteger
378 >kCreateUInteger,
379 >kDestroyUInteger,
380 // Notch
381 >kCreateNotch,
382 >kDestroyNotch,
383 // RoText
384 >kCreateRoText,
385 >kDestroyRoText,
386 // Text
387 >kCreateText,
388 >kDestroyText,
389 // Hex
390 >kCreateHex,
391 >kDestroyHex,
392 // Matrix
393 >kCreateMatrix,
394 >kDestroyMatrix,
395 // Menu
396 >kCreateMenu,
397 >kDestroyMenu,
398 >kCreateMenuDynamic,
399 >kDestroyMenuDynamic,
400 // ThreadCount
401 >kCreateThreadCount,
402 >kDestroyThreadCount,
403 // Bitrate
404 >kCreateBitrate,
405 >kDestroyBitrate,
406 // File
407 >kCreateFile,
408 >kDestroyFile,
409 // Dir
410 >kCreateDir,
411 >kDestroyDir,
412 // Frame
413 >kCreateFrame,
414 >kDestroyFrame,
415 // Toggle uint/int
416 >kCreateToggleUint,
417 >kDestroyToggleUint,
418 >kCreateToggleInt,
419 >kDestroyToggleInt,
420 // Regular toggle
421 >kCreateToggle,
422 >kDestroyToggle,
423 // Slider
424 >kCreateUSlider,
425 >kDestroyUSlider,
426 >kCreateSlider,
427 >kDestroySlider,
428 >kCreateTimeStamp,
429 >kDestroyTimeStamp
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