gwenhywfar 5.14.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#include <strings.h>
45
46
50
51
52
53
54GWEN_DIALOG *GWEN_Dialog_new(const char *dialogId)
55{
56 GWEN_DIALOG *dlg;
57 int rv;
59
61 dlg->refCount=1;
64
65 if (dialogId && *dialogId)
66 dlg->dialogId=strdup(dialogId);
67
68 dlg->i18nDomain=strdup(PACKAGE);
69
70 dlg->widgets=GWEN_Widget_Tree_new();
71
72 dlg->subDialogs=GWEN_Dialog_List_new();
73
74 /* try to load preferences */
75 rv=GWEN_Gui_ReadDialogPrefs(dialogId, NULL, &db);
76 if (rv<0) {
77 DBG_WARN(GWEN_LOGDOMAIN, "Could not read dialog preferences (%d)", rv);
78 dlg->dbPreferences=GWEN_DB_Group_new("preferences");
79 }
80 else {
81 dlg->dbPreferences=db;
82 }
83 dlg->mediaPaths=GWEN_StringList_new();
84
85 return dlg;
86}
87
88
89
91 const char *pmLibName,
92 const char *pmDataDir,
93 const char *fileName)
94{
95 GWEN_DIALOG *dlg;
96 GWEN_BUFFER *fbuf;
97 int rv;
98
99 assert(dialogId);
100 assert(pmLibName);
101 assert(pmDataDir);
102 assert(fileName);
103
104 dlg=GWEN_Dialog_new(dialogId);
105 if (dlg==NULL) {
106 DBG_ERROR(GWEN_LOGDOMAIN, "Could not create dialog");
107 return NULL;
108 }
109
110 /* get path of dialog description file */
111 fbuf=GWEN_Buffer_new(0, 256, 0, 1);
112 rv=GWEN_PathManager_FindFile(pmLibName, pmDataDir, fileName, fbuf);
113 if (rv<0) {
114 DBG_ERROR(GWEN_LOGDOMAIN, "Dialog description file not found (%d).", rv);
115 GWEN_Buffer_free(fbuf);
116 GWEN_Dialog_free(dlg);
117 return NULL;
118 }
119
120 /* read dialog from dialog description file */
122 if (rv<0) {
123 DBG_INFO(GWEN_LOGDOMAIN, "here (%d).", rv);
124 GWEN_Buffer_free(fbuf);
125 GWEN_Dialog_free(dlg);
126 return NULL;
127 }
128 DBG_INFO(GWEN_LOGDOMAIN, "Dialog \"%s\" loaded from \"%s\"", dialogId, GWEN_Buffer_GetStart(fbuf));
129 GWEN_Buffer_free(fbuf);
130
131 return dlg;
132}
133
134
135
136
138{
139 if (dlg) {
140 assert(dlg->refCount);
141
142 if (dlg->refCount>1) {
143 dlg->refCount--;
144 }
145 else {
146 int rv;
147
148 /* try to save preferences */
149 rv=GWEN_Gui_WriteDialogPrefs(dlg->dialogId, dlg->dbPreferences);
150 if (rv<0) {
151 DBG_WARN(GWEN_LOGDOMAIN, "Could not write dialog preferences (%d)", rv);
152 }
153
156 GWEN_Widget_Tree_free(dlg->widgets);
157 free(dlg->dialogId);
158 free(dlg->i18nDomain);
159 dlg->refCount=0;
160 GWEN_Dialog_List_free(dlg->subDialogs);
161
162 GWEN_DB_Group_free(dlg->dbPreferences);
163 GWEN_StringList_free(dlg->mediaPaths);
164
165 GWEN_FREE_OBJECT(dlg);
166 }
167 }
168}
169
170
171
173{
174 assert(dlg);
175 assert(dlg->refCount);
176
177 return dlg->parentDialog;
178}
179
180
181
182const char *GWEN_Dialog_GetId(const GWEN_DIALOG *dlg)
183{
184 assert(dlg);
185 assert(dlg->refCount);
186
187 return dlg->dialogId;
188}
189
190
191
193{
194 assert(dlg);
195 assert(dlg->refCount);
196
197 return dlg->guiId;
198}
199
200
201
202void GWEN_Dialog_SetGuiId(GWEN_DIALOG *dlg, uint32_t guiid)
203{
204 assert(dlg);
205 assert(dlg->refCount);
206
207 dlg->guiId=guiid;
208}
209
210
211
212void GWEN_Dialog_SetI18nDomain(GWEN_DIALOG *dlg, const char *s)
213{
214 assert(dlg);
215 assert(dlg->refCount);
216
217 free(dlg->i18nDomain);
218 if (s)
219 dlg->i18nDomain=strdup(s);
220 else
221 dlg->i18nDomain=strdup(PACKAGE);
222}
223
224
225
227{
228 assert(dlg);
229 assert(dlg->refCount);
230
231 return dlg->i18nDomain;
232}
233
234
235
236const char *GWEN_Dialog_TranslateString(const GWEN_DIALOG *dlg, const char *s)
237{
238 assert(dlg);
239 assert(dlg->refCount);
240
241 return GWEN_I18N_Translate(dlg->i18nDomain, s);
242}
243
244
245
246void GWEN_Dialog_AddMediaPath(GWEN_DIALOG *dlg, const char *s)
247{
248 assert(dlg);
249 assert(dlg->refCount);
250
251 GWEN_StringList_AppendString(dlg->mediaPaths, s, 0, 1);
252}
253
254
255
257 const char *destlib,
258 const char *pathName,
259 const char *relPath)
260{
261 GWEN_STRINGLIST *sl;
262
263 sl=GWEN_PathManager_GetPaths(destlib, pathName);
264 if (sl) {
267 if (se) {
268 GWEN_BUFFER *tbuf;
269
270 tbuf=GWEN_Buffer_new(0, 256, 0, 1);
271 while (se) {
272 const char *s;
273
275 assert(s);
276 if (relPath) {
279 GWEN_Buffer_AppendString(tbuf, relPath);
280 GWEN_StringList_AppendString(dlg->mediaPaths, GWEN_Buffer_GetStart(tbuf), 0, 1);
281 GWEN_Buffer_Reset(tbuf);
282 }
283 else
284 GWEN_StringList_AppendString(dlg->mediaPaths, s, 0, 1);
286 }
287 GWEN_Buffer_free(tbuf);
288 }
290 }
291}
292
293
294
296{
297 assert(dlg);
298 assert(dlg->refCount);
299
300 return dlg->mediaPaths;
301}
302
303
304
307{
309
310 assert(dlg);
311 assert(dlg->refCount);
312
313 oh=dlg->signalHandler;
314 dlg->signalHandler=fn;
315
316 return oh;
317}
318
319
320
323 const char *sender)
324{
325 return GWEN_Dialog_EmitSignal2(dlg, t, sender, -1, NULL);
326}
327
328
329
332 const char *sender)
333{
334 return GWEN_Dialog_EmitSignalToAll2(dlg, t, sender, -1, NULL);
335}
336
337
338
341{
343
344 assert(dlg);
345 assert(dlg->refCount);
346
347 oh=dlg->signalHandler2;
348 dlg->signalHandler2=fn;
349
350 return oh;
351}
352
353
354
357 const char *sender,
358 int intArg,
359 const char *stringArg)
360{
361 assert(dlg);
362 assert(dlg->refCount);
363
364 if (dlg->signalHandler2)
365 return (dlg->signalHandler2)(dlg, t, sender, intArg, stringArg);
366 else if (dlg->signalHandler)
367 return (dlg->signalHandler)(dlg, t, sender);
368 else {
369 DBG_WARN(GWEN_LOGDOMAIN, "No signal handler in dialog [%s]",
370 (dlg->dialogId)?(dlg->dialogId):"-unnamed-");
372 }
373}
374
375
376
379 const char *sender,
380 int intArg,
381 const char *stringArg)
382{
383 int rv;
384 GWEN_DIALOG *subdlg;
385 int anyDialogHasHandledThisSignal=0;
386
387 assert(dlg);
388 assert(dlg->refCount);
389
390 subdlg=GWEN_Dialog_List_First(dlg->subDialogs);
391 while (subdlg) {
392 rv=GWEN_Dialog_EmitSignalToAll2(subdlg, t, sender, intArg, stringArg);
394 anyDialogHasHandledThisSignal=1;
397 return rv;
398 subdlg=GWEN_Dialog_List_Next(subdlg);
399 }
400
401 if (dlg->signalHandler2) {
402 rv=(dlg->signalHandler2)(dlg, t, sender, intArg, stringArg);
404 anyDialogHasHandledThisSignal=1;
407 return rv;
408 }
409 else if (dlg->signalHandler) {
410 rv=(dlg->signalHandler)(dlg, t, sender);
412 anyDialogHasHandledThisSignal=1;
415 return rv;
416 }
417
418 if (anyDialogHasHandledThisSignal)
420 else
422}
423
424
425
427 const char *parentName,
428 GWEN_DIALOG *subdlg)
429{
430 GWEN_WIDGET *wparent;
431
432 wparent=GWEN_Dialog_FindWidgetByName(dlg, parentName);
433 if (wparent) {
434 GWEN_WIDGET *subRoot;
435 GWEN_WIDGET *cw;
436
437 /* move all widgets from the below sub dialog's root widget to the parent dialog */
438 subRoot=GWEN_Widget_Tree_GetFirst(subdlg->widgets);
439 if (subRoot) {
440 while ((cw=GWEN_Widget_Tree_GetFirstChild(subRoot))) {
441 if (subdlg->firstSubWidget==NULL)
442 subdlg->firstSubWidget=cw;
443 GWEN_Widget_Tree_Del(cw);
444 GWEN_Widget_Tree_AddChild(wparent, cw);
445 }
446 }
447
448 /* store pointer to parent widget in dialog */
449 subdlg->parentWidget=wparent;
450
451 /* store pointer to parent dialog in dialog */
452 subdlg->parentDialog=dlg;
453
454 GWEN_Dialog_List_Add(subdlg, dlg->subDialogs);
455
456 return 0;
457 }
458 else {
459 DBG_ERROR(GWEN_LOGDOMAIN, "Parent widget [%s] not found", parentName);
461 }
462}
463
464
465
467 GWEN_WIDGET *wparent,
468 GWEN_XMLNODE *node)
469{
470 GWEN_XMLNODE *n;
471 GWEN_WIDGET *w;
472 int rv;
473
474 w=GWEN_Widget_new(dlg);
475 rv=GWEN_Widget_ReadXml(w, node);
476 if (rv<0) {
477 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
479 return rv;
480 }
481
482 if (wparent)
483 GWEN_Widget_Tree_AddChild(wparent, w);
484 else
485 GWEN_Widget_Tree_Add(dlg->widgets, w);
486
487
488 n=GWEN_XMLNode_FindFirstTag(node, "widget", NULL, NULL);
489 while (n) {
490 int rv;
491
492 rv=GWEN_Dialog__ReadXmlWidget(dlg, w, n);
493 if (rv<0)
494 return rv;
495 n=GWEN_XMLNode_FindNextTag(n, "widget", NULL, NULL);
496 }
497
498 return 0;
499}
500
501
502
504{
505 int rv;
506 const char *s;
507
508 assert(dlg);
509 assert(dlg->refCount);
510
511 assert(dlg->widgets);
512 GWEN_Widget_Tree_Clear(dlg->widgets);
513
514 s=GWEN_XMLNode_GetProperty(node, "i18n", NULL);
515 if (s && *s)
517
518 rv=GWEN_Dialog__ReadXmlWidget(dlg, NULL, node);
519 if (rv<0) {
520 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
521 GWEN_Widget_Tree_free(dlg->widgets);
522 dlg->widgets=NULL;
523 return rv;
524 }
525
526 return 0;
527}
528
529
530
531int GWEN_Dialog_ReadXmlFile(GWEN_DIALOG *dlg, const char *fname)
532{
533 GWEN_XMLNODE *n;
534 GWEN_XMLNODE *nDialog;
535 int rv;
536
538 rv=GWEN_XML_ReadFile(n, fname,
541 if (rv<0) {
542 DBG_ERROR(GWEN_LOGDOMAIN, "here (%d)", rv);
544 return rv;
545 }
546
547 nDialog=GWEN_XMLNode_FindFirstTag(n, "dialog", NULL, NULL);
548 if (nDialog==NULL) {
549 DBG_ERROR(GWEN_LOGDOMAIN, "Dialog element not found in XML file [%s]", fname);
551 return rv;
552 }
553
554 rv=GWEN_Dialog_ReadXml(dlg, nDialog);
555 if (rv<0) {
556 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
558 return rv;
559 }
560
562 return 0;
563}
564
565
566
568{
569 GWEN_WIDGET *w;
570
571 assert(dlg);
572 assert(dlg->refCount);
573 assert(dlg->widgets);
574
575#if 0
576 if (dlg->parentWidget)
577 w=dlg->parentWidget;
578 else
579 w=GWEN_Widget_Tree_GetFirst(dlg->widgets);
580#else
581 if (dlg->firstSubWidget)
582 w=dlg->firstSubWidget;
583 else {
584 w=GWEN_Widget_Tree_GetFirst(dlg->widgets);
585 /* empty name always corresponds to the root */
586 if (name==NULL || *name==0)
587 return w;
588 }
589#endif
590
591 while (w) {
592 const char *s;
593
595 if (s && *s && strcasecmp(s, name)==0)
596 break;
597 w=GWEN_Widget_Tree_GetBelow(w);
598 }
599
600 return w;
601}
602
603
604
605GWEN_WIDGET *GWEN_Dialog_FindWidgetByImplData(const GWEN_DIALOG *dlg, int index, const void *ptr)
606{
607 GWEN_WIDGET *w;
608
609 assert(dlg);
610 assert(dlg->refCount);
611 assert(dlg->widgets);
612
613 if (dlg->parentWidget)
614 w=dlg->parentWidget;
615 else
616 w=GWEN_Widget_Tree_GetFirst(dlg->widgets);
617
618 while (w) {
619 if (ptr==GWEN_Widget_GetImplData(w, index))
620 break;
621 w=GWEN_Widget_Tree_GetBelow(w);
622 }
623
624 return w;
625}
626
627
628
629GWEN_WIDGET_TREE *GWEN_Dialog_GetWidgets(const GWEN_DIALOG *dlg)
630{
631 assert(dlg);
632 assert(dlg->refCount);
633 assert(dlg->widgets);
634
635 return dlg->widgets;
636}
637
638
639
642{
644
645 assert(dlg);
646 assert(dlg->refCount);
647
648 oh=dlg->setIntPropertyFn;
649 dlg->setIntPropertyFn=fn;
650 return oh;
651}
652
653
654
657{
659
660 assert(dlg);
661 assert(dlg->refCount);
662
663 oh=dlg->getIntPropertyFn;
664 dlg->getIntPropertyFn=fn;
665 return oh;
666}
667
668
669
672{
674
675 assert(dlg);
676 assert(dlg->refCount);
677
678 oh=dlg->setCharPropertyFn;
679 dlg->setCharPropertyFn=fn;
680 return oh;
681}
682
683
684
687{
689
690 assert(dlg);
691 assert(dlg->refCount);
692
693 oh=dlg->getCharPropertyFn;
694 dlg->getCharPropertyFn=fn;
695 return oh;
696}
697
698
699
700
701
702
704 const char *name,
706 int index,
707 int value,
708 int doSignal)
709{
710 GWEN_WIDGET *w;
711
712 assert(dlg);
713 assert(dlg->refCount);
714
715 w=GWEN_Dialog_FindWidgetByName(dlg, name);
716 if (w) {
717 if (dlg->setIntPropertyFn)
718 return dlg->setIntPropertyFn(dlg, w, prop, index, value, doSignal);
719 else if (dlg->parentDialog && dlg->parentDialog->setIntPropertyFn)
720 return dlg->parentDialog->setIntPropertyFn(dlg->parentDialog, w, prop, index, value, doSignal);
721 }
722 else {
723 DBG_ERROR(GWEN_LOGDOMAIN, "Widget [%s] not found", name);
725 }
726
727 DBG_ERROR(GWEN_LOGDOMAIN, "Function pointer not set");
729}
730
731
732
734 const char *name,
736 int index,
737 int defaultProperty)
738{
739 GWEN_WIDGET *w;
740
741 assert(dlg);
742 assert(dlg->refCount);
743
744 w=GWEN_Dialog_FindWidgetByName(dlg, name);
745 if (w) {
746 if (dlg->getIntPropertyFn)
747 return dlg->getIntPropertyFn(dlg, w, prop, index, defaultProperty);
748 else if (dlg->parentDialog && dlg->parentDialog->getIntPropertyFn)
749 return dlg->parentDialog->getIntPropertyFn(dlg->parentDialog, w, prop, index, defaultProperty);
750 }
751 else {
752 DBG_ERROR(GWEN_LOGDOMAIN, "Widget [%s] not found", name);
753 return defaultProperty;
754 }
755
756 DBG_ERROR(GWEN_LOGDOMAIN, "Function pointer not set");
757 return defaultProperty;
758}
759
760
761
763 const char *name,
765 int index,
766 const char *value,
767 int doSignal)
768{
769 GWEN_WIDGET *w;
770
771 assert(dlg);
772 assert(dlg->refCount);
773
774 w=GWEN_Dialog_FindWidgetByName(dlg, name);
775 if (w) {
776 if (dlg->setCharPropertyFn)
777 return dlg->setCharPropertyFn(dlg, w, prop, index, value, doSignal);
778 else if (dlg->parentDialog && dlg->parentDialog->setCharPropertyFn)
779 return dlg->parentDialog->setCharPropertyFn(dlg->parentDialog, w, prop, index, value, doSignal);
780 }
781 else {
782 DBG_ERROR(GWEN_LOGDOMAIN, "Widget [%s] not found", name);
784 }
785
786 DBG_ERROR(GWEN_LOGDOMAIN, "Function pointer not set");
788}
789
790
791
793 const char *name,
795 int index,
796 const char *defaultProperty)
797{
798 GWEN_WIDGET *w;
799
800 assert(dlg);
801 assert(dlg->refCount);
802
803 w=GWEN_Dialog_FindWidgetByName(dlg, name);
804 if (w) {
805 if (dlg->getCharPropertyFn)
806 return dlg->getCharPropertyFn(dlg, w, prop, index, defaultProperty);
807 else if (dlg->parentDialog && dlg->parentDialog->getCharPropertyFn)
808 return dlg->parentDialog->getCharPropertyFn(dlg->parentDialog, w, prop, index, defaultProperty);
809 }
810 else {
811 DBG_ERROR(GWEN_LOGDOMAIN, "Widget [%s] not found", name);
812 return defaultProperty;
813 }
814
815 DBG_ERROR(GWEN_LOGDOMAIN, "Function pointer not set");
816 return defaultProperty;
817}
818
819
820
821int GWEN_Dialog_RemoveWidget(GWEN_DIALOG *dlg, const char *name)
822{
823 GWEN_WIDGET *w;
824
825 w=GWEN_Dialog_FindWidgetByName(dlg, name);
826 if (w) {
827 GWEN_Widget_Tree_Del(w);
829 return 0;
830 }
831
833}
834
835
836uint32_t GWEN_Dialog_GetWidgetFlags(const GWEN_DIALOG *dlg, const char *name)
837{
838 GWEN_WIDGET *w;
839
840 w=GWEN_Dialog_FindWidgetByName(dlg, name);
841 if (w) {
842 return GWEN_Widget_GetFlags(w);
843 }
844
845 return 0;
846}
847
848
849
850void GWEN_Dialog_SetWidgetFlags(GWEN_DIALOG *dlg, const char *name, uint32_t fl)
851{
852 GWEN_WIDGET *w;
853
854 w=GWEN_Dialog_FindWidgetByName(dlg, name);
855 if (w) {
857 }
858}
859
860
861
862void GWEN_Dialog_AddWidgetFlags(GWEN_DIALOG *dlg, const char *name, uint32_t fl)
863{
864 GWEN_WIDGET *w;
865
866 w=GWEN_Dialog_FindWidgetByName(dlg, name);
867 if (w) {
869 }
870}
871
872
873
874void GWEN_Dialog_SubWidgetFlags(GWEN_DIALOG *dlg, const char *name, uint32_t fl)
875{
876 GWEN_WIDGET *w;
877
878 w=GWEN_Dialog_FindWidgetByName(dlg, name);
879 if (w) {
881 }
882}
883
884
885
886int GWEN_Dialog_GetWidgetColumns(const GWEN_DIALOG *dlg, const char *name)
887{
888 GWEN_WIDGET *w;
889
890 w=GWEN_Dialog_FindWidgetByName(dlg, name);
891 if (w) {
892 return GWEN_Widget_GetColumns(w);
893 }
894
895 return -1;
896}
897
898
899
900void GWEN_Dialog_SetWidgetColumns(GWEN_DIALOG *dlg, const char *name, int i)
901{
902 GWEN_WIDGET *w;
903
904 w=GWEN_Dialog_FindWidgetByName(dlg, name);
905 if (w) {
907 }
908}
909
910
911
912int GWEN_Dialog_GetWidgetRows(const GWEN_DIALOG *dlg, const char *name)
913{
914 GWEN_WIDGET *w;
915
916 w=GWEN_Dialog_FindWidgetByName(dlg, name);
917 if (w) {
918 return GWEN_Widget_GetRows(w);
919 }
920
921 return -1;
922}
923
924
925
926void GWEN_Dialog_SetWidgetRows(GWEN_DIALOG *dlg, const char *name, int i)
927{
928 GWEN_WIDGET *w;
929
930 w=GWEN_Dialog_FindWidgetByName(dlg, name);
931 if (w) {
933 }
934}
935
936
937
938void GWEN_Dialog_SetWidgetText(GWEN_DIALOG *dlg, const char *name, const char *t)
939{
940 GWEN_WIDGET *w;
941
942 w=GWEN_Dialog_FindWidgetByName(dlg, name);
943 if (w) {
944 GWEN_Widget_SetText(w, 0, t);
945 }
946}
947
948
949
950const char *GWEN_Dialog_GetWidgetText(const GWEN_DIALOG *dlg, const char *name)
951{
952 GWEN_WIDGET *w;
953
954 w=GWEN_Dialog_FindWidgetByName(dlg, name);
955 if (w) {
956 return GWEN_Widget_GetText(w, 0);
957 }
958
959 return NULL;
960}
961
962
963
964static void GWEN_Dialog_DumpWidget(const GWEN_WIDGET *w, FILE *f, unsigned int indent)
965{
966 int i;
967 const char *s;
968 const char *dname=NULL;
969 GWEN_DIALOG *dlg;
970 const GWEN_WIDGET *c;
971
972 for (i=0; i<indent; i++)
973 fprintf(f, " ");
976 if (dlg)
977 dname=GWEN_Dialog_GetId(dlg);
978
979 fprintf(f, "Widget %s: %d [%s]\n", s?s:"unnamed", GWEN_Widget_GetType(w), dname?dname:"no dialog");
980 c=GWEN_Widget_Tree_GetFirstChild(w);
981 while (c) {
982 GWEN_Dialog_DumpWidget(c, f, indent+2);
983 c=GWEN_Widget_Tree_GetNext(c);
984 }
985}
986
987
988
989void GWEN_Dialog_Dump(const GWEN_DIALOG *dlg, FILE *f, unsigned int indent)
990{
991 GWEN_WIDGET *w;
992
993 w=GWEN_Widget_Tree_GetFirst(dlg->widgets);
994 GWEN_Dialog_DumpWidget(w, f, indent);
995}
996
997
998
999
1000
1001
1003{
1004 assert(dlg);
1005 assert(dlg->refCount);
1006
1007 return dlg->dbPreferences;
1008}
1009
1010
1011
1012
1013
1015 const char *widgetName,
1016 const char *variablePrefix,
1017 int maxColumns,
1018 int minColumnSize,
1019 GWEN_DB_NODE *dbPrefs)
1020{
1021 GWEN_BUFFER *nameBuf;
1022 uint32_t posInBuffer;
1023 int i;
1024
1025 nameBuf=GWEN_Buffer_new(0, 256, 0, 1);
1026 GWEN_Buffer_AppendString(nameBuf, variablePrefix);
1027 posInBuffer=GWEN_Buffer_GetPos(nameBuf);
1028
1029 /* write column sizes */
1030 GWEN_Buffer_AppendString(nameBuf, "columns");
1031 GWEN_DB_DeleteVar(dbPrefs, GWEN_Buffer_GetStart(nameBuf));
1032 for (i=0; i<maxColumns; i++) {
1033 int j;
1034
1036 if (j<minColumnSize)
1037 j=minColumnSize;
1039 }
1040
1041 /* determine column to sort by */
1042 GWEN_Buffer_Crop(nameBuf, 0, posInBuffer);
1043 GWEN_Buffer_AppendString(nameBuf, "sortbycolumn");
1045 for (i=0; i<maxColumns; i++) {
1046 int j;
1047
1050
1052
1053 GWEN_Buffer_Crop(nameBuf, 0, posInBuffer);
1054 GWEN_Buffer_AppendString(nameBuf, "sortdir");
1055 GWEN_DB_SetIntValue(dbPrefs,
1057 GWEN_Buffer_GetStart(nameBuf),
1059 break;
1060 }
1061 }
1062 GWEN_Buffer_free(nameBuf);
1063}
1064
1065
1066
1068 const char *widgetName,
1069 const char *variablePrefix,
1070 int maxColumns,
1071 int minColumnSize,
1072 GWEN_DB_NODE *dbPrefs)
1073{
1074 GWEN_BUFFER *nameBuf;
1075 uint32_t posInBuffer;
1076 int i;
1077 int j;
1078
1079 nameBuf=GWEN_Buffer_new(0, 256, 0, 1);
1080 GWEN_Buffer_AppendString(nameBuf, variablePrefix);
1081 posInBuffer=GWEN_Buffer_GetPos(nameBuf);
1082
1083 /* read column sizes */
1084 GWEN_Buffer_AppendString(nameBuf, "columns");
1085 for (i=0; i<maxColumns; i++) {
1086 j=GWEN_DB_GetIntValue(dbPrefs, GWEN_Buffer_GetStart(nameBuf), i, -1);
1087 if (j<minColumnSize)
1088 j=minColumnSize;
1090 }
1091
1092 /* determine column to sort by */
1093 GWEN_Buffer_Crop(nameBuf, 0, posInBuffer);
1094 GWEN_Buffer_AppendString(nameBuf, "sortbycolumn");
1095 i=GWEN_DB_GetIntValue(dbPrefs, GWEN_Buffer_GetStart(nameBuf), 0, -1);
1096 GWEN_Buffer_Crop(nameBuf, 0, posInBuffer);
1097 GWEN_Buffer_AppendString(nameBuf, "sortdir");
1098 j=GWEN_DB_GetIntValue(dbPrefs, GWEN_Buffer_GetStart(nameBuf), 0, -1);
1099 if (i>=0 && j>=0)
1101 GWEN_Buffer_free(nameBuf);
1102}
1103
1104
1105
1106char *GWEN_Dialog_ListGetFirstColumnData(GWEN_DIALOG *dlg, const char *widgetName, int row)
1107{
1108 const char *s;
1109
1111 if (s && *s) {
1112 const char *p;
1113
1114 p=strchr(s, '\t');
1115 if (p) {
1116 int len;
1117
1118 len=(int)(p-s);
1119 if (len) {
1120 char *res;
1121
1122 res=(char *) malloc(len+1);
1123 assert(res);
1124 memmove(res, s, len);
1125 res[len]=0;
1126 return res;
1127 }
1128 }
1129 else
1130 /* no tab, use the whole line */
1131 return strdup(s);
1132 }
1133
1134 return NULL;
1135}
1136
1137
1138
1139int GWEN_Dialog_ListGetItemMatchingFirstColumn(GWEN_DIALOG *dlg, const char *widgetName, const char *dataToMatch)
1140{
1141 if (dataToMatch) {
1142 int idx;
1143 int lengthOfDataToMatch;
1144
1145 lengthOfDataToMatch=strlen(dataToMatch);
1146 for (idx=0; ; idx++) {
1147 const char *s;
1148
1150 if (s && *s) {
1151 const char *p;
1152
1153 p=strchr(s, '\t');
1154 if (p) {
1155 int len;
1156
1157 len=(int)(p-s);
1158 if (len && len==lengthOfDataToMatch && strncasecmp(s, dataToMatch, len)==0)
1159 return idx;
1160 }
1161 else if (strcasecmp(s, dataToMatch)==0)
1162 return idx;
1163 }
1164 else
1165 break;
1166 }
1167 }
1168
1169 return -1;
1170}
1171
1172
1173
1174
1175
#define NULL
Definition binreloc.c:300
GWEN_BUFFER * GWEN_Buffer_new(char *buffer, uint32_t size, uint32_t used, int take)
Definition buffer.c:42
void GWEN_Buffer_Reset(GWEN_BUFFER *bf)
Definition buffer.c:653
uint32_t GWEN_Buffer_GetPos(const GWEN_BUFFER *bf)
Definition buffer.c:253
void GWEN_Buffer_free(GWEN_BUFFER *bf)
Definition buffer.c:89
int GWEN_Buffer_AppendString(GWEN_BUFFER *bf, const char *buffer)
Definition buffer.c:992
char * GWEN_Buffer_GetStart(const GWEN_BUFFER *bf)
Definition buffer.c:235
int GWEN_Buffer_Crop(GWEN_BUFFER *bf, uint32_t pos, uint32_t l)
Definition buffer.c:950
int GWEN_DB_DeleteVar(GWEN_DB_NODE *n, const char *path)
Definition db.c:899
GWEN_DB_NODE * GWEN_DB_Group_new(const char *name)
Definition db.c:173
int GWEN_DB_SetIntValue(GWEN_DB_NODE *n, uint32_t flags, const char *path, int val)
Definition db.c:1202
int GWEN_DB_GetIntValue(GWEN_DB_NODE *n, const char *path, int idx, int defVal)
Definition db.c:1163
void GWEN_DB_Group_free(GWEN_DB_NODE *n)
Definition db.c:421
#define GWEN_DB_FLAGS_DEFAULT
Definition db.h:168
#define GWEN_DB_FLAGS_OVERWRITE_VARS
Definition db.h:121
struct GWEN_DB_NODE GWEN_DB_NODE
Definition db.h:228
#define DBG_INFO(dbg_logger, format,...)
Definition debug.h:181
#define DBG_ERROR(dbg_logger, format,...)
Definition debug.h:97
#define DBG_WARN(dbg_logger, format,...)
Definition debug.h:125
void GWEN_Dialog_SetWidgetRows(GWEN_DIALOG *dlg, const char *name, int i)
Definition dialog.c:926
int GWEN_Dialog_ReadXml(GWEN_DIALOG *dlg, GWEN_XMLNODE *node)
Definition dialog.c:503
int GWEN_Dialog_ListGetItemMatchingFirstColumn(GWEN_DIALOG *dlg, const char *widgetName, const char *dataToMatch)
Definition dialog.c:1139
int GWEN_Dialog_EmitSignalToAll2(GWEN_DIALOG *dlg, GWEN_DIALOG_EVENTTYPE t, const char *sender, int intArg, const char *stringArg)
Definition dialog.c:377
const char * GWEN_Dialog_GetWidgetText(const GWEN_DIALOG *dlg, const char *name)
Definition dialog.c:950
GWEN_WIDGET * GWEN_Dialog_FindWidgetByName(const GWEN_DIALOG *dlg, const char *name)
Definition dialog.c:567
void GWEN_Dialog_SetWidgetFlags(GWEN_DIALOG *dlg, const char *name, uint32_t fl)
Definition dialog.c:850
GWEN_WIDGET_TREE * GWEN_Dialog_GetWidgets(const GWEN_DIALOG *dlg)
Definition dialog.c:629
GWEN_WIDGET * GWEN_Dialog_FindWidgetByImplData(const GWEN_DIALOG *dlg, int index, const void *ptr)
Definition dialog.c:605
void GWEN_Dialog_SetWidgetText(GWEN_DIALOG *dlg, const char *name, const char *t)
Definition dialog.c:938
GWEN_DIALOG_SIGNALHANDLER2 GWEN_Dialog_SetSignalHandler2(GWEN_DIALOG *dlg, GWEN_DIALOG_SIGNALHANDLER2 fn)
Definition dialog.c:339
GWEN_DIALOG_GETINTPROPERTY_FN GWEN_Dialog_SetGetIntPropertyFn(GWEN_DIALOG *dlg, GWEN_DIALOG_GETINTPROPERTY_FN fn)
Definition dialog.c:655
const char * GWEN_Dialog_GetI18nDomain(const GWEN_DIALOG *dlg)
Definition dialog.c:226
GWEN_STRINGLIST * GWEN_Dialog_GetMediaPaths(const GWEN_DIALOG *dlg)
Definition dialog.c:295
const char * GWEN_Dialog_GetId(const GWEN_DIALOG *dlg)
Definition dialog.c:182
int GWEN_Dialog_SetIntProperty(GWEN_DIALOG *dlg, const char *name, GWEN_DIALOG_PROPERTY prop, int index, int value, int doSignal)
Definition dialog.c:703
GWEN_DIALOG_SIGNALHANDLER GWEN_Dialog_SetSignalHandler(GWEN_DIALOG *dlg, GWEN_DIALOG_SIGNALHANDLER fn)
Definition dialog.c:305
void GWEN_Dialog_SetWidgetColumns(GWEN_DIALOG *dlg, const char *name, int i)
Definition dialog.c:900
int GWEN_Dialog_RemoveWidget(GWEN_DIALOG *dlg, const char *name)
Definition dialog.c:821
GWEN_DIALOG * GWEN_Dialog_GetParentDialog(const GWEN_DIALOG *dlg)
Definition dialog.c:172
GWEN_DIALOG_SETINTPROPERTY_FN GWEN_Dialog_SetSetIntPropertyFn(GWEN_DIALOG *dlg, GWEN_DIALOG_SETINTPROPERTY_FN fn)
Definition dialog.c:640
static void GWEN_Dialog_DumpWidget(const GWEN_WIDGET *w, FILE *f, unsigned int indent)
Definition dialog.c:964
GWEN_DIALOG_GETCHARPROPERTY_FN GWEN_Dialog_SetGetCharPropertyFn(GWEN_DIALOG *dlg, GWEN_DIALOG_GETCHARPROPERTY_FN fn)
Definition dialog.c:685
int GWEN_Dialog_SetCharProperty(GWEN_DIALOG *dlg, const char *name, GWEN_DIALOG_PROPERTY prop, int index, const char *value, int doSignal)
Definition dialog.c:762
void GWEN_Dialog_AddMediaPath(GWEN_DIALOG *dlg, const char *s)
Definition dialog.c:246
void GWEN_Dialog_AddWidgetFlags(GWEN_DIALOG *dlg, const char *name, uint32_t fl)
Definition dialog.c:862
uint32_t GWEN_Dialog_GetWidgetFlags(const GWEN_DIALOG *dlg, const char *name)
Definition dialog.c:836
int GWEN_Dialog_GetWidgetRows(const GWEN_DIALOG *dlg, const char *name)
Definition dialog.c:912
void GWEN_Dialog_SetGuiId(GWEN_DIALOG *dlg, uint32_t guiid)
Definition dialog.c:202
void GWEN_Dialog_ListWriteColumnSettings(GWEN_DIALOG *dlg, const char *widgetName, const char *variablePrefix, int maxColumns, int minColumnSize, GWEN_DB_NODE *dbPrefs)
Definition dialog.c:1014
GWEN_DIALOG * GWEN_Dialog_CreateAndLoadWithPath(const char *dialogId, const char *pmLibName, const char *pmDataDir, const char *fileName)
Definition dialog.c:90
int GWEN_Dialog__ReadXmlWidget(GWEN_DIALOG *dlg, GWEN_WIDGET *wparent, GWEN_XMLNODE *node)
Definition dialog.c:466
int GWEN_Dialog_EmitSignal2(GWEN_DIALOG *dlg, GWEN_DIALOG_EVENTTYPE t, const char *sender, int intArg, const char *stringArg)
Definition dialog.c:355
void GWEN_Dialog_ListReadColumnSettings(GWEN_DIALOG *dlg, const char *widgetName, const char *variablePrefix, int maxColumns, int minColumnSize, GWEN_DB_NODE *dbPrefs)
Definition dialog.c:1067
int GWEN_Dialog_GetWidgetColumns(const GWEN_DIALOG *dlg, const char *name)
Definition dialog.c:886
GWEN_DB_NODE * GWEN_Dialog_GetPreferences(const GWEN_DIALOG *dlg)
Definition dialog.c:1002
uint32_t GWEN_Dialog_GetGuiId(const GWEN_DIALOG *dlg)
Definition dialog.c:192
void GWEN_Dialog_AddMediaPathsFromPathManager(GWEN_DIALOG *dlg, const char *destlib, const char *pathName, const char *relPath)
Definition dialog.c:256
void GWEN_Dialog_free(GWEN_DIALOG *dlg)
Definition dialog.c:137
void GWEN_Dialog_SetI18nDomain(GWEN_DIALOG *dlg, const char *s)
Definition dialog.c:212
GWEN_DIALOG * GWEN_Dialog_new(const char *dialogId)
Definition dialog.c:54
int GWEN_Dialog_EmitSignalToAll(GWEN_DIALOG *dlg, GWEN_DIALOG_EVENTTYPE t, const char *sender)
Definition dialog.c:330
void GWEN_Dialog_SubWidgetFlags(GWEN_DIALOG *dlg, const char *name, uint32_t fl)
Definition dialog.c:874
GWEN_DIALOG_SETCHARPROPERTY_FN GWEN_Dialog_SetSetCharPropertyFn(GWEN_DIALOG *dlg, GWEN_DIALOG_SETCHARPROPERTY_FN fn)
Definition dialog.c:670
int GWEN_Dialog_GetIntProperty(GWEN_DIALOG *dlg, const char *name, GWEN_DIALOG_PROPERTY prop, int index, int defaultProperty)
Definition dialog.c:733
int GWEN_Dialog_AddSubDialog(GWEN_DIALOG *dlg, const char *parentName, GWEN_DIALOG *subdlg)
Definition dialog.c:426
int GWEN_Dialog_ReadXmlFile(GWEN_DIALOG *dlg, const char *fname)
Definition dialog.c:531
const char * GWEN_Dialog_GetCharProperty(GWEN_DIALOG *dlg, const char *name, GWEN_DIALOG_PROPERTY prop, int index, const char *defaultProperty)
Definition dialog.c:792
char * GWEN_Dialog_ListGetFirstColumnData(GWEN_DIALOG *dlg, const char *widgetName, int row)
Definition dialog.c:1106
const char * GWEN_Dialog_TranslateString(const GWEN_DIALOG *dlg, const char *s)
Definition dialog.c:236
void GWEN_Dialog_Dump(const GWEN_DIALOG *dlg, FILE *f, unsigned int indent)
Definition dialog.c:989
int GWEN_Dialog_EmitSignal(GWEN_DIALOG *dlg, GWEN_DIALOG_EVENTTYPE t, const char *sender)
Definition dialog.c:321
int GWENHYWFAR_CB(* GWEN_DIALOG_SIGNALHANDLER2)(GWEN_DIALOG *dlg, GWEN_DIALOG_EVENTTYPE t, const char *sender, int intArg, const char *stringArg)
Definition dialog.h:140
@ GWEN_DialogSortDirection_None
Definition dialog.h:297
@ GWEN_DialogSortDirection_Up
Definition dialog.h:298
struct GWEN_DIALOG GWEN_DIALOG
Definition dialog.h:54
GWEN_DIALOG_PROPERTY
Definition dialog.h:260
@ GWEN_DialogProperty_ColumnWidth
Definition dialog.h:271
@ GWEN_DialogProperty_SortDirection
Definition dialog.h:278
@ GWEN_DialogProperty_Value
Definition dialog.h:264
GWEN_DIALOG_EVENTTYPE
Definition dialog.h:98
@ GWEN_DialogEvent_ResultHandled
Definition dialog.h:120
@ GWEN_DialogEvent_ResultNotHandled
Definition dialog.h:121
int GWENHYWFAR_CB(* GWEN_DIALOG_SIGNALHANDLER)(GWEN_DIALOG *dlg, GWEN_DIALOG_EVENTTYPE t, const char *sender)
Definition dialog.h:132
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
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
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 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
#define GWEN_ERROR_NOT_IMPLEMENTED
Definition error.h:108
#define GWEN_ERROR_NOT_FOUND
Definition error.h:89
struct GWEN_BUFFER GWEN_BUFFER
A dynamically resizeable text buffer.
Definition buffer.h:38
GWENHYWFAR_API int GWEN_Gui_WriteDialogPrefs(const char *groupName, GWEN_DB_NODE *db)
GWENHYWFAR_API int GWEN_Gui_ReadDialogPrefs(const char *groupName, const char *altName, GWEN_DB_NODE **pDb)
#define GWEN_DIR_SEPARATOR_S
const char * GWEN_I18N_Translate(const char *txtdom, const char *text)
Definition i18n.c:255
#define GWEN_INHERIT_FUNCTIONS(t)
Definition inherit.h:163
#define GWEN_INHERIT_INIT(t, element)
Definition inherit.h:223
#define GWEN_INHERIT_FINI(t, element)
Definition inherit.h:238
#define GWEN_LIST_FINI(t, element)
Definition list1.h:475
#define GWEN_LIST_FUNCTIONS(t, pr)
Definition list1.h:367
#define GWEN_LIST_INIT(t, element)
Definition list1.h:466
#define GWEN_LIST2_FUNCTIONS(t, pr)
Definition list2.h:99
GWEN_DIALOG * GWEN_Dialog_List_First(const GWEN_DIALOG_LIST *l)
GWEN_DIALOG_LIST * GWEN_Dialog_List_new()
void GWEN_Dialog_List_Add(GWEN_DIALOG *element, GWEN_DIALOG_LIST *list)
void GWEN_Dialog_List_free(GWEN_DIALOG_LIST *l)
GWEN_DIALOG * GWEN_Dialog_List_Next(const GWEN_DIALOG *element)
#define GWEN_LOGDOMAIN
Definition logger.h:32
#define GWEN_FREE_OBJECT(varname)
Definition memory.h:61
#define GWEN_NEW_OBJECT(typ, varname)
Definition memory.h:55
GWEN_STRINGLIST * GWEN_PathManager_GetPaths(const char *destLib, const char *pathName)
int GWEN_PathManager_FindFile(const char *destLib, const char *pathName, const char *fileName, GWEN_BUFFER *fbuf)
void GWEN_StringList_free(GWEN_STRINGLIST *sl)
Definition stringlist.c:62
const char * GWEN_StringListEntry_Data(const GWEN_STRINGLISTENTRY *se)
Definition stringlist.c:406
GWEN_STRINGLISTENTRY * GWEN_StringListEntry_Next(const GWEN_STRINGLISTENTRY *se)
Definition stringlist.c:398
int GWEN_StringList_AppendString(GWEN_STRINGLIST *sl, const char *s, int take, int checkDouble)
Definition stringlist.c:245
GWEN_STRINGLISTENTRY * GWEN_StringList_FirstEntry(const GWEN_STRINGLIST *sl)
Definition stringlist.c:390
GWEN_STRINGLIST * GWEN_StringList_new(void)
Definition stringlist.c:50
struct GWEN_STRINGLISTENTRYSTRUCT GWEN_STRINGLISTENTRY
Definition stringlist.h:53
struct GWEN_STRINGLISTSTRUCT GWEN_STRINGLIST
Definition stringlist.h:56
void GWEN_Widget_free(GWEN_WIDGET *w)
Definition widget.c:66
void GWEN_Widget_SetColumns(GWEN_WIDGET *w, int i)
Definition widget.c:212
int GWEN_Widget_GetColumns(const GWEN_WIDGET *w)
Definition widget.c:203
const char * GWEN_Widget_GetName(const GWEN_WIDGET *w)
Definition widget.c:320
void GWEN_Widget_SetRows(GWEN_WIDGET *w, int i)
Definition widget.c:230
GWEN_WIDGET * GWEN_Widget_new(GWEN_DIALOG *dlg)
Definition widget.c:50
void * GWEN_Widget_GetImplData(const GWEN_WIDGET *w, int index)
Definition widget.c:122
void GWEN_Widget_SetText(GWEN_WIDGET *w, int idx, const char *s)
Definition widget.c:304
const char * GWEN_Widget_GetText(const GWEN_WIDGET *w, int idx)
Definition widget.c:293
void GWEN_Widget_AddFlags(GWEN_WIDGET *w, uint32_t fl)
Definition widget.c:167
void GWEN_Widget_SubFlags(GWEN_WIDGET *w, uint32_t fl)
Definition widget.c:176
uint32_t GWEN_Widget_GetFlags(const GWEN_WIDGET *w)
Definition widget.c:149
GWEN_DIALOG * GWEN_Widget_GetDialog(const GWEN_WIDGET *w)
Definition widget.c:92
int GWEN_Widget_ReadXml(GWEN_WIDGET *w, GWEN_XMLNODE *node)
Definition widget.c:612
GWEN_WIDGET_TYPE GWEN_Widget_GetType(const GWEN_WIDGET *w)
Definition widget.c:185
void GWEN_Widget_SetFlags(GWEN_WIDGET *w, uint32_t fl)
Definition widget.c:158
int GWEN_Widget_GetRows(const GWEN_WIDGET *w)
Definition widget.c:221
struct GWEN_WIDGET GWEN_WIDGET
Definition widget_be.h:34
const char * GWEN_XMLNode_GetProperty(const GWEN_XMLNODE *n, const char *name, const char *defaultValue)
Definition xml.c:239
GWEN_XMLNODE * GWEN_XMLNode_FindFirstTag(const GWEN_XMLNODE *n, const char *tname, const char *pname, const char *pvalue)
Definition xml.c:776
GWEN_XMLNODE * GWEN_XMLNode_new(GWEN_XMLNODE_TYPE t, const char *data)
Definition xml.c:144
GWEN_XMLNODE * GWEN_XMLNode_FindNextTag(const GWEN_XMLNODE *n, const char *tname, const char *pname, const char *pvalue)
Definition xml.c:794
void GWEN_XMLNode_free(GWEN_XMLNODE *n)
Definition xml.c:160
#define GWEN_XML_FLAGS_HANDLE_HEADERS
Definition xml.h:94
struct GWEN__XMLNODE GWEN_XMLNODE
Definition xml.h:156
#define GWEN_XML_FLAGS_DEFAULT
Definition xml.h:117
GWENHYWFAR_API int GWEN_XML_ReadFile(GWEN_XMLNODE *n, const char *filepath, uint32_t flags)
Definition xmlrw.c:1298
@ GWEN_XMLNodeTypeTag
Definition xml.h:145