1 /***************************************************************************
2     begin       : Sun May 16 2010
3     copyright   : (C) 2010 by Martin Preuss
4     email       : martin@libchipcard.de
5 
6  ***************************************************************************
7  *          Please see toplevel file COPYING for license details           *
8  ***************************************************************************/
9 
10 
11 
12 typedef struct GTK2_GRIDLAYOUT_WIDGET GTK2_GRIDLAYOUT_WIDGET;
13 struct GTK2_GRIDLAYOUT_WIDGET {
14   int sortByRow;
15   int allocatedColumns;
16   int allocatedRows;
17 
18   int currentColumn;
19   int currentRow;
20 };
21 
22 
GWEN_INHERIT(GWEN_WIDGET,GTK2_GRIDLAYOUT_WIDGET)23 GWEN_INHERIT(GWEN_WIDGET, GTK2_GRIDLAYOUT_WIDGET)
24 
25 
26 
27 static GWENHYWFAR_CB
28 int Gtk2Gui_WGridLayout_SetIntProperty(GWEN_WIDGET *w,
29                                        GWEN_DIALOG_PROPERTY prop,
30                                        GWEN_UNUSED int index,
31                                        int value,
32                                        GWEN_UNUSED int doSignal)
33 {
34   GtkWidget *g;
35 
36   g=GTK_WIDGET(GWEN_Widget_GetImplData(w, GTK2_DIALOG_WIDGET_REAL));
37   assert(g);
38 
39   switch (prop) {
40   case GWEN_DialogProperty_Enabled:
41     gtk_widget_set_sensitive(GTK_WIDGET(g), (value==0)?FALSE:TRUE);
42     return 0;
43 
44   case GWEN_DialogProperty_Focus:
45     gtk_widget_grab_focus(GTK_WIDGET(g));
46     return 0;
47 
48   default:
49     break;
50   }
51 
52   DBG_WARN(GWEN_LOGDOMAIN,
53            "Function is not appropriate for this type of widget (%s)",
54            GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
55   return GWEN_ERROR_INVALID;
56 }
57 
58 
59 
60 
61 static GWENHYWFAR_CB
Gtk2Gui_WGridLayout_GetIntProperty(GWEN_WIDGET * w,GWEN_DIALOG_PROPERTY prop,GWEN_UNUSED int index,int defaultValue)62 int Gtk2Gui_WGridLayout_GetIntProperty(GWEN_WIDGET *w,
63                                        GWEN_DIALOG_PROPERTY prop,
64                                        GWEN_UNUSED int index,
65                                        int defaultValue)
66 {
67   GtkWidget *g;
68 
69   g=GTK_WIDGET(GWEN_Widget_GetImplData(w, GTK2_DIALOG_WIDGET_REAL));
70   assert(g);
71 
72   switch (prop) {
73   case GWEN_DialogProperty_Enabled:
74     return (gtk_widget_get_sensitive(GTK_WIDGET(g))==TRUE)?1:0;
75 
76   case GWEN_DialogProperty_Focus:
77     return (gtk_widget_has_focus(GTK_WIDGET(g))==TRUE)?1:0;
78     return 0;
79 
80   default:
81     break;
82   }
83 
84   DBG_WARN(GWEN_LOGDOMAIN,
85            "Function is not appropriate for this type of widget (%s)",
86            GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
87   return defaultValue;
88 }
89 
90 
91 
92 static GWENHYWFAR_CB
Gtk2Gui_WGridLayout_SetCharProperty(GWEN_WIDGET * w,GWEN_UNUSED GWEN_DIALOG_PROPERTY prop,GWEN_UNUSED int index,GWEN_UNUSED const char * value,GWEN_UNUSED int doSignal)93 int Gtk2Gui_WGridLayout_SetCharProperty(GWEN_WIDGET *w,
94                                         GWEN_UNUSED GWEN_DIALOG_PROPERTY prop,
95                                         GWEN_UNUSED int index,
96                                         GWEN_UNUSED const char *value,
97                                         GWEN_UNUSED int doSignal)
98 {
99   GtkWidget *g;
100 
101   g=GTK_WIDGET(GWEN_Widget_GetImplData(w, GTK2_DIALOG_WIDGET_REAL));
102   assert(g);
103 
104   DBG_WARN(GWEN_LOGDOMAIN,
105            "Function is not appropriate for this type of widget (%s)",
106            GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
107   return GWEN_ERROR_INVALID;
108 }
109 
110 
111 
112 static GWENHYWFAR_CB
Gtk2Gui_WGridLayout_GetCharProperty(GWEN_WIDGET * w,GWEN_UNUSED GWEN_DIALOG_PROPERTY prop,GWEN_UNUSED int index,const char * defaultValue)113 const char *Gtk2Gui_WGridLayout_GetCharProperty(GWEN_WIDGET *w,
114                                                 GWEN_UNUSED GWEN_DIALOG_PROPERTY prop,
115                                                 GWEN_UNUSED int index,
116                                                 const char *defaultValue)
117 {
118   GtkWidget *g;
119 
120   g=GTK_WIDGET(GWEN_Widget_GetImplData(w, GTK2_DIALOG_WIDGET_REAL));
121   assert(g);
122 
123   DBG_WARN(GWEN_LOGDOMAIN,
124            "Function is not appropriate for this type of widget (%s)",
125            GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
126   return defaultValue;
127 }
128 
129 
130 
131 static GWENHYWFAR_CB
Gtk2Gui_WGridLayout_AddChildGuiWidget(GWEN_WIDGET * w,GWEN_WIDGET * wChild)132 int Gtk2Gui_WGridLayout_AddChildGuiWidget(GWEN_WIDGET *w, GWEN_WIDGET *wChild)
133 {
134   GTK2_GRIDLAYOUT_WIDGET *xw;
135   GtkWidget *g;
136   GtkWidget *gChild;
137   uint32_t cflags;
138   int x;
139   int y;
140 
141   assert(w);
142   xw=GWEN_INHERIT_GETDATA(GWEN_WIDGET, GTK2_GRIDLAYOUT_WIDGET, w);
143   assert(xw);
144 
145   cflags=GWEN_Widget_GetFlags(wChild);
146 
147   g=GTK_WIDGET(GWEN_Widget_GetImplData(w, GTK2_DIALOG_WIDGET_REAL));
148   assert(g);
149 
150   gChild=GTK_WIDGET(GWEN_Widget_GetImplData(wChild, GTK2_DIALOG_WIDGET_REAL));
151   assert(gChild);
152 
153   if (xw->sortByRow) {
154     /* fill rows, enter next column if column full */
155     y=(xw->currentRow)++;
156     if (y>=xw->allocatedRows) {
157       xw->currentRow=0;
158       y=(xw->currentRow)++;
159       xw->currentColumn++;
160     }
161 
162     x=xw->currentColumn;
163     if (x>=xw->allocatedColumns) {
164       xw->allocatedColumns=x+1;
165       gtk_table_resize(GTK_TABLE(g), xw->allocatedRows, xw->allocatedColumns);
166     }
167   }
168   else {
169     /* fill columns, enter next row if row full */
170     x=(xw->currentColumn)++;
171     if (x>=xw->allocatedColumns) {
172       xw->currentColumn=0;
173       x=(xw->currentColumn)++;
174       xw->currentRow++;
175     }
176 
177     y=xw->currentRow;
178     if (y>=xw->allocatedRows) {
179       xw->allocatedRows=y+1;
180       gtk_table_resize(GTK_TABLE(g), xw->allocatedRows, xw->allocatedColumns);
181     }
182   }
183 
184   gtk_table_attach(GTK_TABLE(g), gChild,
185                    x, x+1, y, y+1,
186                    (cflags & GWEN_WIDGET_FLAGS_FILLX)?(GTK_FILL|GTK_EXPAND):0,
187                    (cflags & GWEN_WIDGET_FLAGS_FILLY)?(GTK_FILL|GTK_EXPAND):0,
188                    GTK2_GUI_DIALOG_DEFAULT_BOX_SPACING,
189                    GTK2_GUI_DIALOG_DEFAULT_BOX_SPACING);
190 
191   return 0;
192 }
193 
194 
195 
196 
197 static GWENHYWFAR_CB
Gtk2Gui_WGridLayout_FreeData(GWEN_UNUSED void * bp,void * p)198 void Gtk2Gui_WGridLayout_FreeData(GWEN_UNUSED void *bp, void *p)
199 {
200   GTK2_GRIDLAYOUT_WIDGET *xw;
201 
202   xw=(GTK2_GRIDLAYOUT_WIDGET *) p;
203 
204   GWEN_FREE_OBJECT(xw);
205 }
206 
207 
208 
Gtk2Gui_WGridLayout_Setup(GWEN_WIDGET * w)209 int Gtk2Gui_WGridLayout_Setup(GWEN_WIDGET *w)
210 {
211   GtkWidget *g;
212   /*uint32_t flags;*/
213   GWEN_WIDGET *wParent;
214   GTK2_GRIDLAYOUT_WIDGET *xw;
215   int rows;
216   int cols;
217 
218   GWEN_NEW_OBJECT(GTK2_GRIDLAYOUT_WIDGET, xw);
219   GWEN_INHERIT_SETDATA(GWEN_WIDGET, GTK2_GRIDLAYOUT_WIDGET, w, xw, Gtk2Gui_WGridLayout_FreeData);
220 
221   /*flags=GWEN_Widget_GetFlags(w);*/
222   wParent=GWEN_Widget_Tree_GetParent(w);
223   cols=GWEN_Widget_GetColumns(w);
224   rows=GWEN_Widget_GetRows(w);
225 
226   if (rows>0) {
227     xw->sortByRow=1;
228     xw->allocatedRows=rows;
229     xw->allocatedColumns=1;
230   }
231   else {
232     xw->sortByRow=0;
233     xw->allocatedColumns=cols;
234     xw->allocatedRows=1;
235   }
236 
237   g=gtk_table_new(xw->allocatedRows, xw->allocatedColumns, FALSE);
238 
239   GWEN_Widget_SetImplData(w, GTK2_DIALOG_WIDGET_REAL, (void *) g);
240   GWEN_Widget_SetImplData(w, GTK2_DIALOG_WIDGET_CONTENT, (void *) g);
241 
242   GWEN_Widget_SetSetIntPropertyFn(w, Gtk2Gui_WGridLayout_SetIntProperty);
243   GWEN_Widget_SetGetIntPropertyFn(w, Gtk2Gui_WGridLayout_GetIntProperty);
244   GWEN_Widget_SetSetCharPropertyFn(w, Gtk2Gui_WGridLayout_SetCharProperty);
245   GWEN_Widget_SetGetCharPropertyFn(w, Gtk2Gui_WGridLayout_GetCharProperty);
246   GWEN_Widget_SetAddChildGuiWidgetFn(w, Gtk2Gui_WGridLayout_AddChildGuiWidget);
247 
248   if (wParent)
249     GWEN_Widget_AddChildGuiWidget(wParent, w);
250 
251   return 0;
252 }
253 
254 
255