gwenhywfar
4.3.3
|
00001 /*************************************************************************** 00002 begin : Sun May 16 2010 00003 copyright : (C) 2010 by Martin Preuss 00004 email : martin@libchipcard.de 00005 00006 *************************************************************************** 00007 * Please see toplevel file COPYING for license details * 00008 ***************************************************************************/ 00009 00010 00011 typedef struct W_COMBOBOX W_COMBOBOX; 00012 struct W_COMBOBOX { 00013 GWEN_STRINGLIST *entries; 00014 }; 00015 00016 00017 GWEN_INHERIT(GWEN_WIDGET, W_COMBOBOX) 00018 00019 00020 00021 00022 static GWENHYWFAR_CB 00023 int Gtk2Gui_WComboBox_SetIntProperty(GWEN_WIDGET *w, 00024 GWEN_DIALOG_PROPERTY prop, 00025 int index, 00026 int value, 00027 int doSignal) { 00028 GtkWidget *g; 00029 W_COMBOBOX *xw; 00030 00031 assert(w); 00032 xw=GWEN_INHERIT_GETDATA(GWEN_WIDGET, W_COMBOBOX, w); 00033 assert(xw); 00034 00035 g=GTK_WIDGET(GWEN_Widget_GetImplData(w, GTK2_DIALOG_WIDGET_REAL)); 00036 assert(g); 00037 00038 switch(prop) { 00039 case GWEN_DialogProperty_Enabled: 00040 gtk_widget_set_sensitive(GTK_WIDGET(g), (value==0)?FALSE:TRUE); 00041 return 0; 00042 00043 case GWEN_DialogProperty_Focus: 00044 gtk_widget_grab_focus(GTK_WIDGET(g)); 00045 return 0; 00046 00047 case GWEN_DialogProperty_Value: 00048 gtk_combo_box_set_active(GTK_COMBO_BOX(g), value); 00049 return 0; 00050 00051 case GWEN_DialogProperty_ClearValues: { 00052 GtkListStore *store; 00053 00054 store=GTK_LIST_STORE(gtk_combo_box_get_model(GTK_COMBO_BOX(g))); 00055 assert(store); 00056 gtk_list_store_clear(store); 00057 GWEN_StringList_Clear(xw->entries); 00058 return 0; 00059 } 00060 00061 00062 default: 00063 break; 00064 } 00065 00066 DBG_WARN(GWEN_LOGDOMAIN, 00067 "Function is not appropriate for this type of widget (%s)", 00068 GWEN_Widget_Type_toString(GWEN_Widget_GetType(w))); 00069 return GWEN_ERROR_INVALID; 00070 } 00071 00072 00073 00074 00075 static GWENHYWFAR_CB 00076 int Gtk2Gui_WComboBox_GetIntProperty(GWEN_WIDGET *w, 00077 GWEN_DIALOG_PROPERTY prop, 00078 int index, 00079 int defaultValue) { 00080 GtkWidget *g; 00081 00082 g=GTK_WIDGET(GWEN_Widget_GetImplData(w, GTK2_DIALOG_WIDGET_REAL)); 00083 assert(g); 00084 00085 switch(prop) { 00086 case GWEN_DialogProperty_Enabled: 00087 return (gtk_widget_get_sensitive(GTK_WIDGET(g))==TRUE)?1:0; 00088 00089 case GWEN_DialogProperty_Focus: 00090 return (gtk_widget_has_focus(GTK_WIDGET(g))==TRUE)?1:0; 00091 return 0; 00092 00093 case GWEN_DialogProperty_Value: { 00094 gint i; 00095 00096 i=gtk_combo_box_get_active(GTK_COMBO_BOX(g)); 00097 if (i==-1) 00098 return defaultValue; 00099 else 00100 return i; 00101 } 00102 00103 case GWEN_DialogProperty_ValueCount: { 00104 GtkListStore *store; 00105 gint i; 00106 00107 store=GTK_LIST_STORE(gtk_combo_box_get_model(GTK_COMBO_BOX(g))); 00108 assert(store); 00109 i=gtk_tree_model_iter_n_children(GTK_TREE_MODEL(store), NULL); 00110 return i; 00111 } 00112 00113 default: 00114 break; 00115 } 00116 00117 DBG_WARN(GWEN_LOGDOMAIN, 00118 "Function is not appropriate for this type of widget (%s)", 00119 GWEN_Widget_Type_toString(GWEN_Widget_GetType(w))); 00120 return defaultValue; 00121 } 00122 00123 00124 00125 static GWENHYWFAR_CB 00126 int Gtk2Gui_WComboBox_SetCharProperty(GWEN_WIDGET *w, 00127 GWEN_DIALOG_PROPERTY prop, 00128 int index, 00129 const char *value, 00130 int doSignal) { 00131 GtkWidget *g; 00132 W_COMBOBOX *xw; 00133 00134 assert(w); 00135 xw=GWEN_INHERIT_GETDATA(GWEN_WIDGET, W_COMBOBOX, w); 00136 assert(xw); 00137 00138 g=GTK_WIDGET(GWEN_Widget_GetImplData(w, GTK2_DIALOG_WIDGET_REAL)); 00139 assert(g); 00140 00141 switch(prop) { 00142 case GWEN_DialogProperty_Value: 00143 /* undefined */ 00144 break; 00145 00146 case GWEN_DialogProperty_AddValue: { 00147 GtkListStore *store; 00148 GtkTreeIter iter; 00149 00150 store=GTK_LIST_STORE(gtk_combo_box_get_model(GTK_COMBO_BOX(g))); 00151 assert(store); 00152 00153 gtk_list_store_append(store, &iter); 00154 gtk_list_store_set(store, &iter, 0, value, -1); 00155 GWEN_StringList_AppendString(xw->entries, value, 0, 0); 00156 return 0; 00157 } 00158 00159 case GWEN_DialogProperty_ClearValues: { 00160 GtkListStore *store; 00161 00162 store=GTK_LIST_STORE(gtk_combo_box_get_model(GTK_COMBO_BOX(g))); 00163 assert(store); 00164 gtk_list_store_clear(store); 00165 GWEN_StringList_Clear(xw->entries); 00166 return 0; 00167 } 00168 00169 default: 00170 break; 00171 } 00172 00173 DBG_WARN(GWEN_LOGDOMAIN, 00174 "Function is not appropriate for this type of widget (%s)", 00175 GWEN_Widget_Type_toString(GWEN_Widget_GetType(w))); 00176 return GWEN_ERROR_INVALID; 00177 } 00178 00179 00180 00181 static GWENHYWFAR_CB 00182 const char* Gtk2Gui_WComboBox_GetCharProperty(GWEN_WIDGET *w, 00183 GWEN_DIALOG_PROPERTY prop, 00184 int index, 00185 const char *defaultValue) { 00186 GtkWidget *g; 00187 W_COMBOBOX *xw; 00188 00189 assert(w); 00190 xw=GWEN_INHERIT_GETDATA(GWEN_WIDGET, W_COMBOBOX, w); 00191 assert(xw); 00192 00193 g=GTK_WIDGET(GWEN_Widget_GetImplData(w, GTK2_DIALOG_WIDGET_REAL)); 00194 assert(g); 00195 00196 switch(prop) { 00197 case GWEN_DialogProperty_Value: { 00198 const char *s; 00199 00200 s=GWEN_StringList_StringAt(xw->entries, index); 00201 if (s && *s) 00202 return s; 00203 else 00204 return defaultValue; 00205 } 00206 00207 default: 00208 break; 00209 } 00210 00211 DBG_WARN(GWEN_LOGDOMAIN, 00212 "Function is not appropriate for this type of widget (%s)", 00213 GWEN_Widget_Type_toString(GWEN_Widget_GetType(w))); 00214 return defaultValue; 00215 } 00216 00217 00218 00219 static void changed_handler(GtkWidget *comboBox, gpointer data) { 00220 GWEN_WIDGET *w; 00221 int rv; 00222 00223 w=data; 00224 assert(w); 00225 rv=GWEN_Dialog_EmitSignal(GWEN_Widget_GetDialog(w), 00226 GWEN_DialogEvent_TypeActivated, 00227 GWEN_Widget_GetName(w)); 00228 if (rv==GWEN_DialogEvent_ResultAccept) 00229 Gtk2Gui_Dialog_Leave(GWEN_Widget_GetTopDialog(w), 1); 00230 else if (rv==GWEN_DialogEvent_ResultReject) 00231 Gtk2Gui_Dialog_Leave(GWEN_Widget_GetTopDialog(w), 0); 00232 } 00233 00234 00235 00236 static void GWENHYWFAR_CB Gtk2Gui_WComboBox_FreeData(void *bp, void *p) { 00237 W_COMBOBOX *xw; 00238 00239 xw=(W_COMBOBOX*) p; 00240 GWEN_StringList_free(xw->entries); 00241 GWEN_FREE_OBJECT(xw); 00242 } 00243 00244 00245 00246 int Gtk2Gui_WComboBox_Setup(GWEN_WIDGET *w) { 00247 W_COMBOBOX *xw; 00248 GtkWidget *g; 00249 GtkCellRenderer *cr; 00250 GtkListStore *store; 00251 uint32_t flags; 00252 GWEN_WIDGET *wParent; 00253 gulong changed_handler_id; 00254 00255 flags=GWEN_Widget_GetFlags(w); 00256 wParent=GWEN_Widget_Tree_GetParent(w); 00257 00258 /* create widget */ 00259 store=gtk_list_store_new(1, G_TYPE_STRING); 00260 if (flags & GWEN_WIDGET_FLAGS_READONLY) 00261 g=gtk_combo_box_new_with_model(GTK_TREE_MODEL(store)); 00262 else 00263 /* TODO: why the heck does *this* combo box have two columns in the list?? */ 00264 g=gtk_combo_box_entry_new_with_model(GTK_TREE_MODEL(store), 0); 00265 g_object_unref(store); 00266 00267 cr=gtk_cell_renderer_text_new(); 00268 gtk_cell_layout_pack_start(GTK_CELL_LAYOUT (g), cr, TRUE); 00269 gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(g), cr, "text", 0, NULL); 00270 00271 GWEN_NEW_OBJECT(W_COMBOBOX, xw); 00272 GWEN_INHERIT_SETDATA(GWEN_WIDGET, W_COMBOBOX, w, xw, Gtk2Gui_WComboBox_FreeData); 00273 xw->entries=GWEN_StringList_new(); 00274 00275 GWEN_Widget_SetImplData(w, GTK2_DIALOG_WIDGET_REAL, (void*) g); 00276 GWEN_Widget_SetImplData(w, GTK2_DIALOG_WIDGET_CONTENT, (void*) g); 00277 00278 GWEN_Widget_SetSetIntPropertyFn(w, Gtk2Gui_WComboBox_SetIntProperty); 00279 GWEN_Widget_SetGetIntPropertyFn(w, Gtk2Gui_WComboBox_GetIntProperty); 00280 GWEN_Widget_SetSetCharPropertyFn(w, Gtk2Gui_WComboBox_SetCharProperty); 00281 GWEN_Widget_SetGetCharPropertyFn(w, Gtk2Gui_WComboBox_GetCharProperty); 00282 00283 changed_handler_id=g_signal_connect(g, 00284 "changed", 00285 G_CALLBACK (changed_handler), 00286 w); 00287 00288 if (wParent) 00289 GWEN_Widget_AddChildGuiWidget(wParent, w); 00290 00291 return 0; 00292 } 00293 00294