gwenhywfar 4.0.3

w_combobox.c

Go to the documentation of this file.
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