00001
00002
00003
00004
00005
00006
00007
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
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
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
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