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 W_SPINBOX W_SPINBOX;
13 struct W_SPINBOX {
14   GtkAdjustment *adjustment;
15 };
16 
17 
GWEN_INHERIT(GWEN_WIDGET,W_SPINBOX)18 GWEN_INHERIT(GWEN_WIDGET, W_SPINBOX)
19 
20 
21 
22 static GWENHYWFAR_CB
23 int Gtk2Gui_WSpinBox_SetIntProperty(GWEN_WIDGET *w,
24                                     GWEN_DIALOG_PROPERTY prop,
25                                     GWEN_UNUSED int index,
26                                     int value,
27                                     GWEN_UNUSED int doSignal)
28 {
29   GtkWidget *g;
30   W_SPINBOX *xw;
31 
32   assert(w);
33   xw=GWEN_INHERIT_GETDATA(GWEN_WIDGET, W_SPINBOX, w);
34   assert(xw);
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   case GWEN_DialogProperty_Width:
49   case GWEN_DialogProperty_Height:
50     /* just ignore these for now */
51     return 0;
52 
53   case GWEN_DialogProperty_Value:
54     gtk_adjustment_set_value(GTK_ADJUSTMENT(xw->adjustment), value);
55     return 0;
56 
57   case GWEN_DialogProperty_MinValue:
58     gtk_adjustment_set_lower(GTK_ADJUSTMENT(xw->adjustment), value);
59     return 0;
60 
61   case GWEN_DialogProperty_MaxValue:
62     gtk_adjustment_set_upper(GTK_ADJUSTMENT(xw->adjustment), value);
63     return 0;
64 
65   default:
66     break;
67   }
68 
69   DBG_WARN(GWEN_LOGDOMAIN,
70            "Function is not appropriate for this type of widget (%s)",
71            GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
72   return GWEN_ERROR_INVALID;
73 }
74 
75 
76 
77 
78 static GWENHYWFAR_CB
Gtk2Gui_WSpinBox_GetIntProperty(GWEN_WIDGET * w,GWEN_DIALOG_PROPERTY prop,GWEN_UNUSED int index,int defaultValue)79 int Gtk2Gui_WSpinBox_GetIntProperty(GWEN_WIDGET *w,
80                                     GWEN_DIALOG_PROPERTY prop,
81                                     GWEN_UNUSED int index,
82                                     int defaultValue)
83 {
84   GtkWidget *g;
85   W_SPINBOX *xw;
86 
87   assert(w);
88   xw=GWEN_INHERIT_GETDATA(GWEN_WIDGET, W_SPINBOX, w);
89   assert(xw);
90 
91   g=GTK_WIDGET(GWEN_Widget_GetImplData(w, GTK2_DIALOG_WIDGET_REAL));
92   assert(g);
93 
94   switch (prop) {
95   case GWEN_DialogProperty_Enabled:
96     return (gtk_widget_get_sensitive(GTK_WIDGET(g))==TRUE)?1:0;
97 
98   case GWEN_DialogProperty_Focus:
99     return (gtk_widget_has_focus(GTK_WIDGET(g))==TRUE)?1:0;
100     return 0;
101 
102   case GWEN_DialogProperty_Width:
103   case GWEN_DialogProperty_Height:
104     /* just ignore these for now */
105     return 0;
106 
107   case GWEN_DialogProperty_Value:
108     return gtk_adjustment_get_value(GTK_ADJUSTMENT(xw->adjustment));
109 
110   case GWEN_DialogProperty_MinValue:
111     return gtk_adjustment_get_lower(GTK_ADJUSTMENT(xw->adjustment));
112 
113   case GWEN_DialogProperty_MaxValue:
114     return gtk_adjustment_get_upper(GTK_ADJUSTMENT(xw->adjustment));
115 
116   default:
117     break;
118   }
119 
120   DBG_WARN(GWEN_LOGDOMAIN,
121            "Function is not appropriate for this type of widget (%s)",
122            GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
123   return defaultValue;
124 }
125 
126 
127 
128 static GWENHYWFAR_CB
Gtk2Gui_WSpinBox_SetCharProperty(GWEN_WIDGET * w,GWEN_UNUSED GWEN_DIALOG_PROPERTY prop,GWEN_UNUSED int index,GWEN_UNUSED const char * value,GWEN_UNUSED int doSignal)129 int Gtk2Gui_WSpinBox_SetCharProperty(GWEN_WIDGET *w,
130                                      GWEN_UNUSED GWEN_DIALOG_PROPERTY prop,
131                                      GWEN_UNUSED int index,
132                                      GWEN_UNUSED const char *value,
133                                      GWEN_UNUSED int doSignal)
134 {
135   DBG_WARN(GWEN_LOGDOMAIN,
136            "Function is not appropriate for this type of widget (%s)",
137            GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
138   return GWEN_ERROR_INVALID;
139 }
140 
141 
142 
143 static GWENHYWFAR_CB
Gtk2Gui_WSpinBox_GetCharProperty(GWEN_WIDGET * w,GWEN_UNUSED GWEN_DIALOG_PROPERTY prop,GWEN_UNUSED int index,const char * defaultValue)144 const char *Gtk2Gui_WSpinBox_GetCharProperty(GWEN_WIDGET *w,
145                                              GWEN_UNUSED GWEN_DIALOG_PROPERTY prop,
146                                              GWEN_UNUSED int index,
147                                              const char *defaultValue)
148 {
149   DBG_WARN(GWEN_LOGDOMAIN,
150            "Function is not appropriate for this type of widget (%s)",
151            GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
152   return defaultValue;
153 }
154 
155 
156 
Gtk2Gui_WSpinBox_FreeData(GWEN_UNUSED void * bp,void * p)157 static void GWENHYWFAR_CB Gtk2Gui_WSpinBox_FreeData(GWEN_UNUSED void *bp, void *p)
158 {
159   W_SPINBOX *xw;
160 
161   xw=(W_SPINBOX *) p;
162   GWEN_FREE_OBJECT(xw);
163 }
164 
165 
166 
Gtk2Gui_WSpinBox_Changed_handler(GWEN_UNUSED GtkAdjustment * adjustment,gpointer data)167 static void Gtk2Gui_WSpinBox_Changed_handler(GWEN_UNUSED GtkAdjustment *adjustment, gpointer data)
168 {
169   GWEN_WIDGET *w;
170   int rv;
171 
172   w=data;
173   assert(w);
174   rv=GWEN_Dialog_EmitSignal(GWEN_Widget_GetDialog(w),
175                             GWEN_DialogEvent_TypeValueChanged,
176                             GWEN_Widget_GetName(w));
177   if (rv==GWEN_DialogEvent_ResultAccept)
178     Gtk2Gui_Dialog_Leave(GWEN_Widget_GetTopDialog(w), 1);
179   else if (rv==GWEN_DialogEvent_ResultReject)
180     Gtk2Gui_Dialog_Leave(GWEN_Widget_GetTopDialog(w), 0);
181 }
182 
183 
184 
Gtk2Gui_WSpinBox_Setup(GWEN_WIDGET * w)185 int Gtk2Gui_WSpinBox_Setup(GWEN_WIDGET *w)
186 {
187   GtkWidget *g;
188   /*const char *s;*/
189   /*uint32_t flags;*/
190   GWEN_WIDGET *wParent;
191   W_SPINBOX *xw;
192   /*gulong changed_handler_id;*/
193 
194   GWEN_NEW_OBJECT(W_SPINBOX, xw);
195   GWEN_INHERIT_SETDATA(GWEN_WIDGET, W_SPINBOX, w, xw, Gtk2Gui_WSpinBox_FreeData);
196 
197   /*flags=GWEN_Widget_GetFlags(w);*/
198   wParent=GWEN_Widget_Tree_GetParent(w);
199   /*s=GWEN_Widget_GetText(w, 0);*/
200 
201   xw->adjustment=GTK_ADJUSTMENT(gtk_adjustment_new(0.0, 0.0, 100.0, 1.0, 5.0, 5.0));
202   g=gtk_spin_button_new(xw->adjustment, 1.0, 0);
203   GWEN_Widget_SetImplData(w, GTK2_DIALOG_WIDGET_REAL, (void *) g);
204   GWEN_Widget_SetImplData(w, GTK2_DIALOG_WIDGET_CONTENT, (void *) g);
205 
206   GWEN_Widget_SetSetIntPropertyFn(w, Gtk2Gui_WSpinBox_SetIntProperty);
207   GWEN_Widget_SetGetIntPropertyFn(w, Gtk2Gui_WSpinBox_GetIntProperty);
208   GWEN_Widget_SetSetCharPropertyFn(w, Gtk2Gui_WSpinBox_SetCharProperty);
209   GWEN_Widget_SetGetCharPropertyFn(w, Gtk2Gui_WSpinBox_GetCharProperty);
210 
211   /*changed_handler_id=*/g_signal_connect(g,
212                                           "value-changed",
213                                           G_CALLBACK(Gtk2Gui_WSpinBox_Changed_handler),
214                                           w);
215 
216   if (wParent)
217     GWEN_Widget_AddChildGuiWidget(wParent, w);
218 
219   return 0;
220 }
221 
222 
223