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