gwenhywfar  5.4.1
dialog.c
Go to the documentation of this file.
1 /***************************************************************************
2  begin : Wed Jan 20 2010
3  copyright : (C) 2019 by Martin Preuss
4  email : martin@libchipcard.de
5 
6  ***************************************************************************
7  * *
8  * This library is free software; you can redistribute it and/or *
9  * modify it under the terms of the GNU Lesser General Public *
10  * License as published by the Free Software Foundation; either *
11  * version 2.1 of the License, or (at your option) any later version. *
12  * *
13  * This library is distributed in the hope that it will be useful, *
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of *
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
16  * Lesser General Public License for more details. *
17  * *
18  * You should have received a copy of the GNU Lesser General Public *
19  * License along with this library; if not, write to the Free Software *
20  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, *
21  * MA 02111-1307 USA *
22  * *
23  ***************************************************************************/
24 
25 
26 #ifdef HAVE_CONFIG_H
27 # include <config.h>
28 #endif
29 
30 #define DISABLE_DEBUGLOG
31 
32 
33 #include "dialog_p.h"
34 #include "widget_l.h"
35 #include "gui_l.h"
36 
37 #include <gwenhywfar/text.h>
38 #include <gwenhywfar/pathmanager.h>
39 #include <gwenhywfar/debug.h>
40 #include <gwenhywfar/i18n.h>
41 
42 #include <assert.h>
43 #include <ctype.h>
44 
45 
47 GWEN_LIST_FUNCTIONS(GWEN_DIALOG, GWEN_Dialog)
49 
50 
51 
52 
53 GWEN_DIALOG *GWEN_Dialog_new(const char *dialogId)
54 {
55  GWEN_DIALOG *dlg;
56  int rv;
57  GWEN_DB_NODE *db=NULL;
58 
60  dlg->refCount=1;
63 
64  if (dialogId && *dialogId)
65  dlg->dialogId=strdup(dialogId);
66 
67  dlg->i18nDomain=strdup(PACKAGE);
68 
69  dlg->widgets=GWEN_Widget_Tree_new();
70 
71  dlg->subDialogs=GWEN_Dialog_List_new();
72 
73  /* try to load preferences */
74  rv=GWEN_Gui_ReadDialogPrefs(dialogId, NULL, &db);
75  if (rv<0) {
76  DBG_WARN(GWEN_LOGDOMAIN, "Could not read dialog preferences (%d)", rv);
77  dlg->dbPreferences=GWEN_DB_Group_new("preferences");
78  }
79  else {
80  dlg->dbPreferences=db;
81  }
82  dlg->mediaPaths=GWEN_StringList_new();
83 
84  return dlg;
85 }
86 
87 
88 
90  const char *pmLibName,
91  const char *pmDataDir,
92  const char *fileName)
93 {
94  GWEN_DIALOG *dlg;
95  GWEN_BUFFER *fbuf;
96  int rv;
97 
98  assert(dialogId);
99  assert(pmLibName);
100  assert(pmDataDir);
101  assert(fileName);
102 
103  dlg=GWEN_Dialog_new(dialogId);
104  if (dlg==NULL) {
105  DBG_ERROR(GWEN_LOGDOMAIN, "Could not create dialog");
106  return NULL;
107  }
108 
109  /* get path of dialog description file */
110  fbuf=GWEN_Buffer_new(0, 256, 0, 1);
111  rv=GWEN_PathManager_FindFile(pmLibName, pmDataDir, fileName, fbuf);
112  if (rv<0) {
113  DBG_ERROR(GWEN_LOGDOMAIN, "Dialog description file not found (%d).", rv);
114  GWEN_Buffer_free(fbuf);
115  GWEN_Dialog_free(dlg);
116  return NULL;
117  }
118 
119  /* read dialog from dialog description file */
121  if (rv<0) {
122  DBG_INFO(GWEN_LOGDOMAIN, "here (%d).", rv);
123  GWEN_Buffer_free(fbuf);
124  GWEN_Dialog_free(dlg);
125  return NULL;
126  }
127  DBG_INFO(GWEN_LOGDOMAIN, "Dialog \"%s\" loaded from \"%s\"", dialogId, GWEN_Buffer_GetStart(fbuf));
128  GWEN_Buffer_free(fbuf);
129 
130  return dlg;
131 }
132 
133 
134 
135 
137 {
138  if (dlg) {
139  assert(dlg->refCount);
140 
141  if (dlg->refCount>1) {
142  dlg->refCount--;
143  }
144  else {
145  int rv;
146 
147  /* try to save preferences */
148  rv=GWEN_Gui_WriteDialogPrefs(dlg->dialogId, dlg->dbPreferences);
149  if (rv<0) {
150  DBG_WARN(GWEN_LOGDOMAIN, "Could not write dialog preferences (%d)", rv);
151  }
152 
155  GWEN_Widget_Tree_free(dlg->widgets);
156  free(dlg->dialogId);
157  free(dlg->i18nDomain);
158  dlg->refCount=0;
159  GWEN_Dialog_List_free(dlg->subDialogs);
160 
161  GWEN_DB_Group_free(dlg->dbPreferences);
162  GWEN_StringList_free(dlg->mediaPaths);
163 
164  GWEN_FREE_OBJECT(dlg);
165  }
166  }
167 }
168 
169 
170 
172 {
173  assert(dlg);
174  assert(dlg->refCount);
175 
176  return dlg->parentDialog;
177 }
178 
179 
180 
181 const char *GWEN_Dialog_GetId(const GWEN_DIALOG *dlg)
182 {
183  assert(dlg);
184  assert(dlg->refCount);
185 
186  return dlg->dialogId;
187 }
188 
189 
190 
191 uint32_t GWEN_Dialog_GetGuiId(const GWEN_DIALOG *dlg)
192 {
193  assert(dlg);
194  assert(dlg->refCount);
195 
196  return dlg->guiId;
197 }
198 
199 
200 
201 void GWEN_Dialog_SetGuiId(GWEN_DIALOG *dlg, uint32_t guiid)
202 {
203  assert(dlg);
204  assert(dlg->refCount);
205 
206  dlg->guiId=guiid;
207 }
208 
209 
210 
211 void GWEN_Dialog_SetI18nDomain(GWEN_DIALOG *dlg, const char *s)
212 {
213  assert(dlg);
214  assert(dlg->refCount);
215 
216  free(dlg->i18nDomain);
217  if (s)
218  dlg->i18nDomain=strdup(s);
219  else
220  dlg->i18nDomain=strdup(PACKAGE);
221 }
222 
223 
224 
225 const char *GWEN_Dialog_GetI18nDomain(const GWEN_DIALOG *dlg)
226 {
227  assert(dlg);
228  assert(dlg->refCount);
229 
230  return dlg->i18nDomain;
231 }
232 
233 
234 
235 const char *GWEN_Dialog_TranslateString(const GWEN_DIALOG *dlg, const char *s)
236 {
237  assert(dlg);
238  assert(dlg->refCount);
239 
240  return GWEN_I18N_Translate(dlg->i18nDomain, s);
241 }
242 
243 
244 
245 void GWEN_Dialog_AddMediaPath(GWEN_DIALOG *dlg, const char *s)
246 {
247  assert(dlg);
248  assert(dlg->refCount);
249 
250  GWEN_StringList_AppendString(dlg->mediaPaths, s, 0, 1);
251 }
252 
253 
254 
256  const char *destlib,
257  const char *pathName,
258  const char *relPath)
259 {
260  GWEN_STRINGLIST *sl;
261 
262  sl=GWEN_PathManager_GetPaths(destlib, pathName);
263  if (sl) {
266  if (se) {
267  GWEN_BUFFER *tbuf;
268 
269  tbuf=GWEN_Buffer_new(0, 256, 0, 1);
270  while (se) {
271  const char *s;
272 
274  assert(s);
275  if (relPath) {
276  GWEN_Buffer_AppendString(tbuf, s);
278  GWEN_Buffer_AppendString(tbuf, relPath);
279  GWEN_StringList_AppendString(dlg->mediaPaths, GWEN_Buffer_GetStart(tbuf), 0, 1);
280  GWEN_Buffer_Reset(tbuf);
281  }
282  else
283  GWEN_StringList_AppendString(dlg->mediaPaths, s, 0, 1);
285  }
286  GWEN_Buffer_free(tbuf);
287  }
289  }
290 }
291 
292 
293 
295 {
296  assert(dlg);
297  assert(dlg->refCount);
298 
299  return dlg->mediaPaths;
300 }
301 
302 
303 
306 {
308 
309  assert(dlg);
310  assert(dlg->refCount);
311 
312  oh=dlg->signalHandler;
313  dlg->signalHandler=fn;
314 
315  return oh;
316 }
317 
318 
319 
322  const char *sender)
323 {
324  assert(dlg);
325  assert(dlg->refCount);
326 
327  if (dlg->signalHandler)
328  return (dlg->signalHandler)(dlg, t, sender);
329  else {
330  DBG_WARN(GWEN_LOGDOMAIN, "No signal handler in dialog [%s]",
331  (dlg->dialogId)?(dlg->dialogId):"-unnamed-");
333  }
334 }
335 
336 
337 
340  const char *sender)
341 {
342  int rv;
343  GWEN_DIALOG *subdlg;
344 
345  assert(dlg);
346  assert(dlg->refCount);
347 
348  subdlg=GWEN_Dialog_List_First(dlg->subDialogs);
349  while (subdlg) {
350  rv=GWEN_Dialog_EmitSignalToAll(subdlg, t, sender);
353  return rv;
354  subdlg=GWEN_Dialog_List_Next(subdlg);
355  }
356 
357  if (dlg->signalHandler) {
358  rv=(dlg->signalHandler)(dlg, t, sender);
361  return rv;
362  }
363 
365 }
366 
367 
368 
370  const char *parentName,
371  GWEN_DIALOG *subdlg)
372 {
373  GWEN_WIDGET *wparent;
374 
375  wparent=GWEN_Dialog_FindWidgetByName(dlg, parentName);
376  if (wparent) {
377  GWEN_WIDGET *subRoot;
378  GWEN_WIDGET *cw;
379 
380  /* move all widgets from the below sub dialog's root widget to the parent dialog */
381  subRoot=GWEN_Widget_Tree_GetFirst(subdlg->widgets);
382  if (subRoot) {
383  while ((cw=GWEN_Widget_Tree_GetFirstChild(subRoot))) {
384  if (subdlg->firstSubWidget==NULL)
385  subdlg->firstSubWidget=cw;
386  GWEN_Widget_Tree_Del(cw);
387  GWEN_Widget_Tree_AddChild(wparent, cw);
388  }
389  }
390 
391  /* store pointer to parent widget in dialog */
392  subdlg->parentWidget=wparent;
393 
394  /* store pointer to parent dialog in dialog */
395  subdlg->parentDialog=dlg;
396 
397  GWEN_Dialog_List_Add(subdlg, dlg->subDialogs);
398 
399  return 0;
400  }
401  else {
402  DBG_ERROR(GWEN_LOGDOMAIN, "Parent widget [%s] not found", parentName);
403  return GWEN_ERROR_NOT_FOUND;
404  }
405 }
406 
407 
408 
410  GWEN_WIDGET *wparent,
411  GWEN_XMLNODE *node)
412 {
413  GWEN_XMLNODE *n;
414  GWEN_WIDGET *w;
415  int rv;
416 
417  w=GWEN_Widget_new(dlg);
418  rv=GWEN_Widget_ReadXml(w, node);
419  if (rv<0) {
420  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
421  GWEN_Widget_free(w);
422  return rv;
423  }
424 
425  if (wparent)
426  GWEN_Widget_Tree_AddChild(wparent, w);
427  else
428  GWEN_Widget_Tree_Add(dlg->widgets, w);
429 
430 
431  n=GWEN_XMLNode_FindFirstTag(node, "widget", NULL, NULL);
432  while (n) {
433  int rv;
434 
435  rv=GWEN_Dialog__ReadXmlWidget(dlg, w, n);
436  if (rv<0)
437  return rv;
438  n=GWEN_XMLNode_FindNextTag(n, "widget", NULL, NULL);
439  }
440 
441  return 0;
442 }
443 
444 
445 
447 {
448  int rv;
449  const char *s;
450 
451  assert(dlg);
452  assert(dlg->refCount);
453 
454  assert(dlg->widgets);
455  GWEN_Widget_Tree_Clear(dlg->widgets);
456 
457  s=GWEN_XMLNode_GetProperty(node, "i18n", NULL);
458  if (s && *s)
460 
461  rv=GWEN_Dialog__ReadXmlWidget(dlg, NULL, node);
462  if (rv<0) {
463  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
464  GWEN_Widget_Tree_free(dlg->widgets);
465  dlg->widgets=NULL;
466  return rv;
467  }
468 
469  return 0;
470 }
471 
472 
473 
474 int GWEN_Dialog_ReadXmlFile(GWEN_DIALOG *dlg, const char *fname)
475 {
476  GWEN_XMLNODE *n;
477  GWEN_XMLNODE *nDialog;
478  int rv;
479 
481  rv=GWEN_XML_ReadFile(n, fname,
484  if (rv<0) {
485  DBG_ERROR(GWEN_LOGDOMAIN, "here (%d)", rv);
487  return rv;
488  }
489 
490  nDialog=GWEN_XMLNode_FindFirstTag(n, "dialog", NULL, NULL);
491  if (nDialog==NULL) {
492  DBG_ERROR(GWEN_LOGDOMAIN, "Dialog element not found in XML file [%s]", fname);
494  return rv;
495  }
496 
497  rv=GWEN_Dialog_ReadXml(dlg, nDialog);
498  if (rv<0) {
499  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
501  return rv;
502  }
503 
505  return 0;
506 }
507 
508 
509 
511 {
512  GWEN_WIDGET *w;
513 
514  assert(dlg);
515  assert(dlg->refCount);
516  assert(dlg->widgets);
517 
518 #if 0
519  if (dlg->parentWidget)
520  w=dlg->parentWidget;
521  else
522  w=GWEN_Widget_Tree_GetFirst(dlg->widgets);
523 #else
524  if (dlg->firstSubWidget)
525  w=dlg->firstSubWidget;
526  else {
527  w=GWEN_Widget_Tree_GetFirst(dlg->widgets);
528  /* empty name always corresponds to the root */
529  if (name==NULL || *name==0)
530  return w;
531  }
532 #endif
533 
534  while (w) {
535  const char *s;
536 
537  s=GWEN_Widget_GetName(w);
538  if (s && *s && strcasecmp(s, name)==0)
539  break;
540  w=GWEN_Widget_Tree_GetBelow(w);
541  }
542 
543  return w;
544 }
545 
546 
547 
548 GWEN_WIDGET *GWEN_Dialog_FindWidgetByImplData(const GWEN_DIALOG *dlg, int index, const void *ptr)
549 {
550  GWEN_WIDGET *w;
551 
552  assert(dlg);
553  assert(dlg->refCount);
554  assert(dlg->widgets);
555 
556  if (dlg->parentWidget)
557  w=dlg->parentWidget;
558  else
559  w=GWEN_Widget_Tree_GetFirst(dlg->widgets);
560 
561  while (w) {
562  if (ptr==GWEN_Widget_GetImplData(w, index))
563  break;
564  w=GWEN_Widget_Tree_GetBelow(w);
565  }
566 
567  return w;
568 }
569 
570 
571 
572 GWEN_WIDGET_TREE *GWEN_Dialog_GetWidgets(const GWEN_DIALOG *dlg)
573 {
574  assert(dlg);
575  assert(dlg->refCount);
576  assert(dlg->widgets);
577 
578  return dlg->widgets;
579 }
580 
581 
582 
585 {
587 
588  assert(dlg);
589  assert(dlg->refCount);
590 
591  oh=dlg->setIntPropertyFn;
592  dlg->setIntPropertyFn=fn;
593  return oh;
594 }
595 
596 
597 
600 {
602 
603  assert(dlg);
604  assert(dlg->refCount);
605 
606  oh=dlg->getIntPropertyFn;
607  dlg->getIntPropertyFn=fn;
608  return oh;
609 }
610 
611 
612 
615 {
617 
618  assert(dlg);
619  assert(dlg->refCount);
620 
621  oh=dlg->setCharPropertyFn;
622  dlg->setCharPropertyFn=fn;
623  return oh;
624 }
625 
626 
627 
630 {
632 
633  assert(dlg);
634  assert(dlg->refCount);
635 
636  oh=dlg->getCharPropertyFn;
637  dlg->getCharPropertyFn=fn;
638  return oh;
639 }
640 
641 
642 
643 
644 
645 
647  const char *name,
649  int index,
650  int value,
651  int doSignal)
652 {
653  GWEN_WIDGET *w;
654 
655  assert(dlg);
656  assert(dlg->refCount);
657 
658  w=GWEN_Dialog_FindWidgetByName(dlg, name);
659  if (w) {
660  if (dlg->setIntPropertyFn)
661  return dlg->setIntPropertyFn(dlg, w, prop, index, value, doSignal);
662  else if (dlg->parentDialog && dlg->parentDialog->setIntPropertyFn)
663  return dlg->parentDialog->setIntPropertyFn(dlg->parentDialog, w, prop, index, value, doSignal);
664  }
665  else {
666  DBG_ERROR(GWEN_LOGDOMAIN, "Widget [%s] not found", name);
667  return GWEN_ERROR_NOT_FOUND;
668  }
669 
670  DBG_ERROR(GWEN_LOGDOMAIN, "Function pointer not set");
672 }
673 
674 
675 
677  const char *name,
679  int index,
680  int defaultProperty)
681 {
682  GWEN_WIDGET *w;
683 
684  assert(dlg);
685  assert(dlg->refCount);
686 
687  w=GWEN_Dialog_FindWidgetByName(dlg, name);
688  if (w) {
689  if (dlg->getIntPropertyFn)
690  return dlg->getIntPropertyFn(dlg, w, prop, index, defaultProperty);
691  else if (dlg->parentDialog && dlg->parentDialog->getIntPropertyFn)
692  return dlg->parentDialog->getIntPropertyFn(dlg->parentDialog, w, prop, index, defaultProperty);
693  }
694  else {
695  DBG_ERROR(GWEN_LOGDOMAIN, "Widget [%s] not found", name);
696  return defaultProperty;
697  }
698 
699  DBG_ERROR(GWEN_LOGDOMAIN, "Function pointer not set");
700  return defaultProperty;
701 }
702 
703 
704 
706  const char *name,
708  int index,
709  const char *value,
710  int doSignal)
711 {
712  GWEN_WIDGET *w;
713 
714  assert(dlg);
715  assert(dlg->refCount);
716 
717  w=GWEN_Dialog_FindWidgetByName(dlg, name);
718  if (w) {
719  if (dlg->setCharPropertyFn)
720  return dlg->setCharPropertyFn(dlg, w, prop, index, value, doSignal);
721  else if (dlg->parentDialog && dlg->parentDialog->setCharPropertyFn)
722  return dlg->parentDialog->setCharPropertyFn(dlg->parentDialog, w, prop, index, value, doSignal);
723  }
724  else {
725  DBG_ERROR(GWEN_LOGDOMAIN, "Widget [%s] not found", name);
726  return GWEN_ERROR_NOT_FOUND;
727  }
728 
729  DBG_ERROR(GWEN_LOGDOMAIN, "Function pointer not set");
731 }
732 
733 
734 
736  const char *name,
738  int index,
739  const char *defaultProperty)
740 {
741  GWEN_WIDGET *w;
742 
743  assert(dlg);
744  assert(dlg->refCount);
745 
746  w=GWEN_Dialog_FindWidgetByName(dlg, name);
747  if (w) {
748  if (dlg->getCharPropertyFn)
749  return dlg->getCharPropertyFn(dlg, w, prop, index, defaultProperty);
750  else if (dlg->parentDialog && dlg->parentDialog->getCharPropertyFn)
751  return dlg->parentDialog->getCharPropertyFn(dlg->parentDialog, w, prop, index, defaultProperty);
752  }
753  else {
754  DBG_ERROR(GWEN_LOGDOMAIN, "Widget [%s] not found", name);
755  return defaultProperty;
756  }
757 
758  DBG_ERROR(GWEN_LOGDOMAIN, "Function pointer not set");
759  return defaultProperty;
760 }
761 
762 
763 
764 int GWEN_Dialog_RemoveWidget(GWEN_DIALOG *dlg, const char *name)
765 {
766  GWEN_WIDGET *w;
767 
768  w=GWEN_Dialog_FindWidgetByName(dlg, name);
769  if (w) {
770  GWEN_Widget_Tree_Del(w);
771  GWEN_Widget_free(w);
772  return 0;
773  }
774 
775  return GWEN_ERROR_NOT_FOUND;
776 }
777 
778 
779 uint32_t GWEN_Dialog_GetWidgetFlags(const GWEN_DIALOG *dlg, const char *name)
780 {
781  GWEN_WIDGET *w;
782 
783  w=GWEN_Dialog_FindWidgetByName(dlg, name);
784  if (w) {
785  return GWEN_Widget_GetFlags(w);
786  }
787 
788  return 0;
789 }
790 
791 
792 
793 void GWEN_Dialog_SetWidgetFlags(GWEN_DIALOG *dlg, const char *name, uint32_t fl)
794 {
795  GWEN_WIDGET *w;
796 
797  w=GWEN_Dialog_FindWidgetByName(dlg, name);
798  if (w) {
799  GWEN_Widget_SetFlags(w, fl);
800  }
801 }
802 
803 
804 
805 void GWEN_Dialog_AddWidgetFlags(GWEN_DIALOG *dlg, const char *name, uint32_t fl)
806 {
807  GWEN_WIDGET *w;
808 
809  w=GWEN_Dialog_FindWidgetByName(dlg, name);
810  if (w) {
811  GWEN_Widget_AddFlags(w, fl);
812  }
813 }
814 
815 
816 
817 void GWEN_Dialog_SubWidgetFlags(GWEN_DIALOG *dlg, const char *name, uint32_t fl)
818 {
819  GWEN_WIDGET *w;
820 
821  w=GWEN_Dialog_FindWidgetByName(dlg, name);
822  if (w) {
823  GWEN_Widget_SubFlags(w, fl);
824  }
825 }
826 
827 
828 
829 int GWEN_Dialog_GetWidgetColumns(const GWEN_DIALOG *dlg, const char *name)
830 {
831  GWEN_WIDGET *w;
832 
833  w=GWEN_Dialog_FindWidgetByName(dlg, name);
834  if (w) {
835  return GWEN_Widget_GetColumns(w);
836  }
837 
838  return -1;
839 }
840 
841 
842 
843 void GWEN_Dialog_SetWidgetColumns(GWEN_DIALOG *dlg, const char *name, int i)
844 {
845  GWEN_WIDGET *w;
846 
847  w=GWEN_Dialog_FindWidgetByName(dlg, name);
848  if (w) {
850  }
851 }
852 
853 
854 
855 int GWEN_Dialog_GetWidgetRows(const GWEN_DIALOG *dlg, const char *name)
856 {
857  GWEN_WIDGET *w;
858 
859  w=GWEN_Dialog_FindWidgetByName(dlg, name);
860  if (w) {
861  return GWEN_Widget_GetRows(w);
862  }
863 
864  return -1;
865 }
866 
867 
868 
869 void GWEN_Dialog_SetWidgetRows(GWEN_DIALOG *dlg, const char *name, int i)
870 {
871  GWEN_WIDGET *w;
872 
873  w=GWEN_Dialog_FindWidgetByName(dlg, name);
874  if (w) {
875  GWEN_Widget_SetRows(w, i);
876  }
877 }
878 
879 
880 
881 void GWEN_Dialog_SetWidgetText(GWEN_DIALOG *dlg, const char *name, const char *t)
882 {
883  GWEN_WIDGET *w;
884 
885  w=GWEN_Dialog_FindWidgetByName(dlg, name);
886  if (w) {
887  GWEN_Widget_SetText(w, 0, t);
888  }
889 }
890 
891 
892 
893 const char *GWEN_Dialog_GetWidgetText(const GWEN_DIALOG *dlg, const char *name)
894 {
895  GWEN_WIDGET *w;
896 
897  w=GWEN_Dialog_FindWidgetByName(dlg, name);
898  if (w) {
899  return GWEN_Widget_GetText(w, 0);
900  }
901 
902  return NULL;
903 }
904 
905 
906 
907 static void GWEN_Dialog_DumpWidget(const GWEN_WIDGET *w, FILE *f, unsigned int indent)
908 {
909  int i;
910  const char *s;
911  const char *dname=NULL;
912  GWEN_DIALOG *dlg;
913  const GWEN_WIDGET *c;
914 
915  for (i=0; i<indent; i++)
916  fprintf(f, " ");
917  s=GWEN_Widget_GetName(w);
918  dlg=GWEN_Widget_GetDialog(w);
919  if (dlg)
920  dname=GWEN_Dialog_GetId(dlg);
921 
922  fprintf(f, "Widget %s: %d [%s]\n", s?s:"unnamed", GWEN_Widget_GetType(w), dname?dname:"no dialog");
923  c=GWEN_Widget_Tree_GetFirstChild(w);
924  while (c) {
925  GWEN_Dialog_DumpWidget(c, f, indent+2);
926  c=GWEN_Widget_Tree_GetNext(c);
927  }
928 }
929 
930 
931 
932 void GWEN_Dialog_Dump(const GWEN_DIALOG *dlg, FILE *f, unsigned int indent)
933 {
934  GWEN_WIDGET *w;
935 
936  w=GWEN_Widget_Tree_GetFirst(dlg->widgets);
937  GWEN_Dialog_DumpWidget(w, f, indent);
938 }
939 
940 
941 
942 
943 
944 
946 {
947  assert(dlg);
948  assert(dlg->refCount);
949 
950  return dlg->dbPreferences;
951 }
952 
953 
954 
955 
GWEN_WIDGET_TYPE GWEN_Widget_GetType(const GWEN_WIDGET *w)
Definition: widget.c:185
void GWEN_Dialog_SetWidgetColumns(GWEN_DIALOG *dlg, const char *name, int i)
Definition: dialog.c:843
char * GWEN_Buffer_GetStart(const GWEN_BUFFER *bf)
Definition: buffer.c:235
struct GWEN_STRINGLISTENTRYSTRUCT GWEN_STRINGLISTENTRY
Definition: stringlist.h:51
void GWEN_Widget_SetText(GWEN_WIDGET *w, int idx, const char *s)
Definition: widget.c:304
struct GWEN_DB_NODE GWEN_DB_NODE
Definition: db.h:228
#define GWEN_INHERIT_FINI(t, element)
Definition: inherit.h:238
#define GWEN_XML_FLAGS_DEFAULT
Definition: xml.h:110
void GWEN_DB_Group_free(GWEN_DB_NODE *n)
Definition: db.c:419
GWEN_DIALOG * GWEN_Dialog_List_Next(const GWEN_DIALOG *element)
#define GWEN_DIR_SEPARATOR_S
const char * GWEN_XMLNode_GetProperty(const GWEN_XMLNODE *n, const char *name, const char *defaultValue)
Definition: xml.c:239
const char * GWEN_Widget_GetName(const GWEN_WIDGET *w)
Definition: widget.c:320
GWEN_XMLNODE * GWEN_XMLNode_FindNextTag(const GWEN_XMLNODE *n, const char *tname, const char *pname, const char *pvalue)
Definition: xml.c:754
static void GWEN_Dialog_DumpWidget(const GWEN_WIDGET *w, FILE *f, unsigned int indent)
Definition: dialog.c:907
GWEN_WIDGET_TREE * GWEN_Dialog_GetWidgets(const GWEN_DIALOG *dlg)
Definition: dialog.c:572
GWEN_DIALOG_SETINTPROPERTY_FN GWEN_Dialog_SetSetIntPropertyFn(GWEN_DIALOG *dlg, GWEN_DIALOG_SETINTPROPERTY_FN fn)
Definition: dialog.c:583
GWEN_DIALOG * GWEN_Dialog_List_First(const GWEN_DIALOG_LIST *l)
GWEN_DIALOG_PROPERTY
Definition: dialog.h:232
#define GWEN_FREE_OBJECT(varname)
Definition: memory.h:61
#define NULL
Definition: binreloc.c:300
int GWEN_Dialog_RemoveWidget(GWEN_DIALOG *dlg, const char *name)
Definition: dialog.c:764
void GWEN_Widget_SetFlags(GWEN_WIDGET *w, uint32_t fl)
Definition: widget.c:158
int GWEN_Gui_WriteDialogPrefs(const char *groupName, GWEN_DB_NODE *db)
Definition: gui.c:1558
GWENHYWFAR_API int GWEN_XML_ReadFile(GWEN_XMLNODE *n, const char *filepath, uint32_t flags)
Definition: xmlrw.c:1297
void GWEN_Widget_free(GWEN_WIDGET *w)
Definition: widget.c:66
void GWEN_Widget_SubFlags(GWEN_WIDGET *w, uint32_t fl)
Definition: widget.c:176
void GWEN_Dialog_AddWidgetFlags(GWEN_DIALOG *dlg, const char *name, uint32_t fl)
Definition: dialog.c:805
uint32_t GWEN_Widget_GetFlags(const GWEN_WIDGET *w)
Definition: widget.c:149
GWEN_DIALOG_EVENTTYPE
Definition: dialog.h:90
const char *GWENHYWFAR_CB(* GWEN_DIALOG_GETCHARPROPERTY_FN)(GWEN_DIALOG *dlg, GWEN_WIDGET *w, GWEN_DIALOG_PROPERTY prop, int index, const char *defaultValue)
Definition: dialog_be.h:62
#define DBG_WARN(dbg_logger, format, args...)
Definition: debug.h:124
const char * GWEN_Dialog_TranslateString(const GWEN_DIALOG *dlg, const char *s)
Definition: dialog.c:235
int GWEN_Widget_GetRows(const GWEN_WIDGET *w)
Definition: widget.c:221
GWEN_DIALOG_SIGNALHANDLER GWEN_Dialog_SetSignalHandler(GWEN_DIALOG *dlg, GWEN_DIALOG_SIGNALHANDLER fn)
Definition: dialog.c:304
#define GWEN_LOGDOMAIN
Definition: logger.h:35
GWEN_DB_NODE * GWEN_Dialog_GetPreferences(const GWEN_DIALOG *dlg)
Definition: dialog.c:945
GWEN_XMLNODE * GWEN_XMLNode_new(GWEN_XMLNODE_TYPE t, const char *data)
Definition: xml.c:144
uint32_t GWEN_Dialog_GetWidgetFlags(const GWEN_DIALOG *dlg, const char *name)
Definition: dialog.c:779
GWEN_BUFFER * GWEN_Buffer_new(char *buffer, uint32_t size, uint32_t used, int take)
Definition: buffer.c:42
struct GWEN_DIALOG GWEN_DIALOG
Definition: dialog.h:54
int GWENHYWFAR_CB(* GWEN_DIALOG_GETINTPROPERTY_FN)(GWEN_DIALOG *dlg, GWEN_WIDGET *w, GWEN_DIALOG_PROPERTY prop, int index, int defaultValue)
Definition: dialog_be.h:49
GWEN_STRINGLISTENTRY * GWEN_StringList_FirstEntry(const GWEN_STRINGLIST *sl)
Definition: stringlist.c:386
void GWEN_Buffer_Reset(GWEN_BUFFER *bf)
Definition: buffer.c:650
const char * GWEN_StringListEntry_Data(const GWEN_STRINGLISTENTRY *se)
Definition: stringlist.c:402
int GWEN_Dialog__ReadXmlWidget(GWEN_DIALOG *dlg, GWEN_WIDGET *wparent, GWEN_XMLNODE *node)
Definition: dialog.c:409
const char * GWEN_Dialog_GetId(const GWEN_DIALOG *dlg)
Definition: dialog.c:181
void GWEN_Dialog_List_Add(GWEN_DIALOG *element, GWEN_DIALOG_LIST *list)
void GWEN_Dialog_SetWidgetText(GWEN_DIALOG *dlg, const char *name, const char *t)
Definition: dialog.c:881
GWEN_WIDGET * GWEN_Dialog_FindWidgetByName(const GWEN_DIALOG *dlg, const char *name)
Definition: dialog.c:510
void GWEN_StringList_free(GWEN_STRINGLIST *sl)
Definition: stringlist.c:58
GWEN_XMLNODE * GWEN_XMLNode_FindFirstTag(const GWEN_XMLNODE *n, const char *tname, const char *pname, const char *pvalue)
Definition: xml.c:736
GWEN_WIDGET * GWEN_Dialog_FindWidgetByImplData(const GWEN_DIALOG *dlg, int index, const void *ptr)
Definition: dialog.c:548
void GWEN_Dialog_SetWidgetRows(GWEN_DIALOG *dlg, const char *name, int i)
Definition: dialog.c:869
#define GWEN_NEW_OBJECT(typ, varname)
Definition: memory.h:55
void * GWEN_Widget_GetImplData(const GWEN_WIDGET *w, int index)
Definition: widget.c:122
GWEN_DIALOG * GWEN_Widget_GetDialog(const GWEN_WIDGET *w)
Definition: widget.c:92
int GWEN_Widget_GetColumns(const GWEN_WIDGET *w)
Definition: widget.c:203
int GWEN_StringList_AppendString(GWEN_STRINGLIST *sl, const char *s, int take, int checkDouble)
Definition: stringlist.c:241
int GWEN_Dialog_GetIntProperty(GWEN_DIALOG *dlg, const char *name, GWEN_DIALOG_PROPERTY prop, int index, int defaultProperty)
Definition: dialog.c:676
int GWEN_Dialog_EmitSignalToAll(GWEN_DIALOG *dlg, GWEN_DIALOG_EVENTTYPE t, const char *sender)
Definition: dialog.c:338
void GWEN_Dialog_SetI18nDomain(GWEN_DIALOG *dlg, const char *s)
Definition: dialog.c:211
void GWEN_Dialog_SetWidgetFlags(GWEN_DIALOG *dlg, const char *name, uint32_t fl)
Definition: dialog.c:793
GWEN_STRINGLIST * GWEN_Dialog_GetMediaPaths(const GWEN_DIALOG *dlg)
Definition: dialog.c:294
struct GWEN_STRINGLISTSTRUCT GWEN_STRINGLIST
Definition: stringlist.h:54
void GWEN_Dialog_SetGuiId(GWEN_DIALOG *dlg, uint32_t guiid)
Definition: dialog.c:201
int GWENHYWFAR_CB(* GWEN_DIALOG_SIGNALHANDLER)(GWEN_DIALOG *dlg, GWEN_DIALOG_EVENTTYPE t, const char *sender)
Definition: dialog.h:122
void GWEN_Widget_SetRows(GWEN_WIDGET *w, int i)
Definition: widget.c:230
void GWEN_Dialog_List_free(GWEN_DIALOG_LIST *l)
#define GWEN_INHERIT_INIT(t, element)
Definition: inherit.h:223
struct GWEN_WIDGET GWEN_WIDGET
Definition: widget_be.h:34
void GWEN_Widget_SetColumns(GWEN_WIDGET *w, int i)
Definition: widget.c:212
GWEN_STRINGLIST * GWEN_PathManager_GetPaths(const char *destLib, const char *pathName)
Definition: pathmanager.c:494
GWEN_DIALOG_SETCHARPROPERTY_FN GWEN_Dialog_SetSetCharPropertyFn(GWEN_DIALOG *dlg, GWEN_DIALOG_SETCHARPROPERTY_FN fn)
Definition: dialog.c:613
void GWEN_Buffer_free(GWEN_BUFFER *bf)
Definition: buffer.c:89
void GWEN_XMLNode_free(GWEN_XMLNODE *n)
Definition: xml.c:160
struct GWEN_BUFFER GWEN_BUFFER
A dynamically resizeable text buffer.
Definition: buffer.h:38
GWEN_LIST2_FUNCTIONS(TYPEMAKER2_TYPE, Typemaker2_Type)
void GWEN_Dialog_Dump(const GWEN_DIALOG *dlg, FILE *f, unsigned int indent)
Definition: dialog.c:932
GWEN_DIALOG_LIST * GWEN_Dialog_List_new()
const char * GWEN_Dialog_GetI18nDomain(const GWEN_DIALOG *dlg)
Definition: dialog.c:225
int GWENHYWFAR_CB(* GWEN_DIALOG_SETCHARPROPERTY_FN)(GWEN_DIALOG *dlg, GWEN_WIDGET *w, GWEN_DIALOG_PROPERTY prop, int index, const char *value, int doSignal)
Definition: dialog_be.h:55
int GWEN_Dialog_EmitSignal(GWEN_DIALOG *dlg, GWEN_DIALOG_EVENTTYPE t, const char *sender)
Definition: dialog.c:320
#define DBG_ERROR(dbg_logger, format, args...)
Definition: debug.h:97
const char * GWEN_Dialog_GetCharProperty(GWEN_DIALOG *dlg, const char *name, GWEN_DIALOG_PROPERTY prop, int index, const char *defaultProperty)
Definition: dialog.c:735
int GWEN_Gui_ReadDialogPrefs(const char *groupName, const char *altName, GWEN_DB_NODE **pDb)
Definition: gui.c:1547
int GWEN_Dialog_SetIntProperty(GWEN_DIALOG *dlg, const char *name, GWEN_DIALOG_PROPERTY prop, int index, int value, int doSignal)
Definition: dialog.c:646
int GWEN_Widget_ReadXml(GWEN_WIDGET *w, GWEN_XMLNODE *node)
Definition: widget.c:596
int GWEN_Dialog_ReadXml(GWEN_DIALOG *dlg, GWEN_XMLNODE *node)
Definition: dialog.c:446
GWEN_DIALOG * GWEN_Dialog_new(const char *dialogId)
Definition: dialog.c:53
GWEN_STRINGLISTENTRY * GWEN_StringListEntry_Next(const GWEN_STRINGLISTENTRY *se)
Definition: stringlist.c:394
GWEN_WIDGET * GWEN_Widget_new(GWEN_DIALOG *dlg)
Definition: widget.c:50
int GWENHYWFAR_CB(* GWEN_DIALOG_SETINTPROPERTY_FN)(GWEN_DIALOG *dlg, GWEN_WIDGET *w, GWEN_DIALOG_PROPERTY prop, int index, int value, int doSignal)
Definition: dialog_be.h:42
int GWEN_Dialog_SetCharProperty(GWEN_DIALOG *dlg, const char *name, GWEN_DIALOG_PROPERTY prop, int index, const char *value, int doSignal)
Definition: dialog.c:705
#define GWEN_ERROR_NOT_FOUND
Definition: error.h:89
const char * GWEN_I18N_Translate(const char *txtdom, const char *text)
Definition: i18n.c:255
void GWEN_Dialog_AddMediaPath(GWEN_DIALOG *dlg, const char *s)
Definition: dialog.c:245
int GWEN_Dialog_GetWidgetRows(const GWEN_DIALOG *dlg, const char *name)
Definition: dialog.c:855
const char * GWEN_Dialog_GetWidgetText(const GWEN_DIALOG *dlg, const char *name)
Definition: dialog.c:893
#define DBG_INFO(dbg_logger, format, args...)
Definition: debug.h:178
void GWEN_Dialog_SubWidgetFlags(GWEN_DIALOG *dlg, const char *name, uint32_t fl)
Definition: dialog.c:817
void GWEN_Widget_AddFlags(GWEN_WIDGET *w, uint32_t fl)
Definition: widget.c:167
GWEN_DIALOG * GWEN_Dialog_GetParentDialog(const GWEN_DIALOG *dlg)
Definition: dialog.c:171
int GWEN_Dialog_GetWidgetColumns(const GWEN_DIALOG *dlg, const char *name)
Definition: dialog.c:829
#define GWEN_LIST_INIT(t, element)
Definition: list1.h:465
int GWEN_Dialog_AddSubDialog(GWEN_DIALOG *dlg, const char *parentName, GWEN_DIALOG *subdlg)
Definition: dialog.c:369
#define GWEN_XML_FLAGS_HANDLE_HEADERS
Definition: xml.h:94
void GWEN_Dialog_AddMediaPathsFromPathManager(GWEN_DIALOG *dlg, const char *destlib, const char *pathName, const char *relPath)
Definition: dialog.c:255
GWEN_DB_NODE * GWEN_DB_Group_new(const char *name)
Definition: db.c:171
void GWEN_Dialog_free(GWEN_DIALOG *dlg)
Definition: dialog.c:136
int GWEN_Dialog_ReadXmlFile(GWEN_DIALOG *dlg, const char *fname)
Definition: dialog.c:474
uint32_t GWEN_Dialog_GetGuiId(const GWEN_DIALOG *dlg)
Definition: dialog.c:191
#define GWEN_LIST_FUNCTIONS(t, pr)
Definition: list1.h:366
GWEN_DIALOG_GETINTPROPERTY_FN GWEN_Dialog_SetGetIntPropertyFn(GWEN_DIALOG *dlg, GWEN_DIALOG_GETINTPROPERTY_FN fn)
Definition: dialog.c:598
int GWEN_PathManager_FindFile(const char *destLib, const char *pathName, const char *fileName, GWEN_BUFFER *fbuf)
Definition: pathmanager.c:541
GWEN_STRINGLIST * GWEN_StringList_new(void)
Definition: stringlist.c:46
GWEN_DIALOG_GETCHARPROPERTY_FN GWEN_Dialog_SetGetCharPropertyFn(GWEN_DIALOG *dlg, GWEN_DIALOG_GETCHARPROPERTY_FN fn)
Definition: dialog.c:628
GWEN_DIALOG * GWEN_Dialog_CreateAndLoadWithPath(const char *dialogId, const char *pmLibName, const char *pmDataDir, const char *fileName)
Definition: dialog.c:89
#define GWEN_LIST_FINI(t, element)
Definition: list1.h:474
const char * GWEN_Widget_GetText(const GWEN_WIDGET *w, int idx)
Definition: widget.c:293
#define GWEN_INHERIT_FUNCTIONS(t)
Definition: inherit.h:163
struct GWEN__XMLNODE GWEN_XMLNODE
Definition: xml.h:149
int GWEN_Buffer_AppendString(GWEN_BUFFER *bf, const char *buffer)
Definition: buffer.c:989
#define GWEN_ERROR_NOT_IMPLEMENTED
Definition: error.h:108