00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032 #include <stdlib.h>
00033 #include <string.h>
00034
00035 #include "gadgets/gadget_Dropdown.h"
00036
00037 #include "debug.h"
00038 #include "classes.h"
00039 #include "Bases.h"
00040 #include "Module.h"
00041 #include "Memory.h"
00042 #include "Common.h"
00043 #include "Image.h"
00044 #include "Window.h"
00045 #include "xml_Gui.h"
00046
00047
00048 struct _dropdown
00049 {
00050 Gadget_t gadget;
00051 char *labels;
00052 char **label_array;
00053 int state;
00054 Gadget_t *subtree;
00055 char *gui_file;
00056 };
00057
00058 static bases_Modules_t *api;
00059 VERSION("Dropdown.gadget",1,0,"Gergely Gati","g.gati@freemail.hu");
00060
00061 static gadget_Binding_t binding[]=
00062 {
00063 {"labels", TAG_DRP_LABELS, GADGET_STRING,""},
00064 GADGET_BINDING_DONE
00065 };
00066
00067 static char *color_names[]=
00068 {
00069 "text",
00070 NULL
00071 };
00072
00073 static gadget_Check_t sub_checklist[]=
00074 {
00075 { 3, "Test", GADGET_REQUIRED },
00076 GADGET_CHECK_DONE
00077 };
00078
00079
00080
00081 static char empty[]="";
00082
00083
00084
00085
00086
00087
00088
00089
00090 static void dropdown_get_extent(Gadget_t *this, Extent_t *min, Extent_t *max)
00091 {
00092 u32 font;
00093
00094 debug_Begin();
00095
00096 font=api->gadget_Call(GADGET_GET_FONT,TAG_GADGET_OBJECT,this,TAG_DONE);
00097 min->width=50;
00098 min->height=5+api->glw_Call(GLW_GETFONTSIZE,TAG_GLW_FONT,font,TAG_DONE);
00099 max->width=GADGET_MAXIMUM_SIZE;
00100 max->height=min->height;
00101
00102 debug_End();
00103 }
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114 static void dropdown_layout(Gadget_t *this, Rect_t *rect)
00115 {
00116 Rect_t rct;
00117
00118 debug_Begin();
00119
00120 rct.left=rect->left+4;
00121 rct.top=rect->top+2;
00122 rct.width=rect->width-8;
00123 rct.height=rect->height-4;
00124
00125 api->glw_Call(GLW_SETCOLOR,TAG_GLW_WINDOW,this->window->handle,TAG_GLW_RGB,api->gadget_Call(GADGET_GET_COLOR,TAG_GADGET_OBJECT,this,TAG_GADGET_COLOR,DRP_COL_TEXT,TAG_DONE),TAG_DONE);
00126 api->glw_Call(GLW_DRAWTEXT,TAG_GLW_WINDOW,this->window->handle,TAG_GLW_CLIPRECT,&rct,TAG_GLW_FONT,api->gadget_Call(GADGET_GET_FONT,TAG_GADGET_OBJECT,this,TAG_DONE),TAG_GLW_TEXT,((dropdown *)this)->labels,TAG_GLW_FLAGS,GLWFA_ALIGN_LEFT|GLWFA_VALIGN_CENTER,TAG_DONE);
00127
00128 debug_End();
00129 }
00130
00131
00132 int dropdown_event_handler(Gadget_t *this, Gadget_t *sender, int event, u32 event_data)
00133 {
00134 int ret=0;
00135
00136 debug_Begin();
00137
00138 switch(event)
00139 {
00140 case CBK_GADGET_UP:
00141 {
00142
00143 break;
00144 }
00145 }
00146
00147 debug_End();
00148
00149 return(ret);
00150 }
00151
00152
00153 static int dropdown_subwin_event_handler(gui_App_t *app, Window_t *win, u32 gadget_id, int event, u32 event_data)
00154 {
00155 if(event==CBK_WINDOW_INACTIVATED||(gadget_id==3&&event==CBK_GADGET_UP)) api->window_Call(WINDOW_CLOSEWINDOW,TAG_WIN_OBJECT,win,TAG_DONE,0L);
00156
00157 return(0);
00158 }
00159
00160
00161 static int dropdown_input_event_handler(Gadget_t *gad, struct glw_Event *event)
00162 {
00163 int ret=0;
00164 dropdown *this=(dropdown *)gad;
00165
00166 debug_Begin();
00167
00168 switch(event->event)
00169 {
00170 case GLWEV_MOUSEMOVE:
00171 {
00172 break;
00173 }
00174 case GLWEV_MOUSEBUTTONS:
00175 {
00176 switch(event->data)
00177 {
00178 case GLWEVD_LEFTDOWN:
00179 {
00180 Rect_t r;
00181 api->glw_Call(GLW_GETWINDOWDIMENSIONS,TAG_GLW_WINDOW,gad->window->handle,TAG_GLW_RECT,&r,TAG_DONE);
00182 ((dropdown *)gad)->state=1;
00183
00184
00185 ret=api->gadget_Call(GADGET_CALLBACK,TAG_GADGET_OBJECT,gad,TAG_GADGET_EVENT,CBK_GADGET_DOWN,TAG_GADGET_EVENT_DATA,0L,TAG_DONE);
00186
00187
00188 api->window_Call(WINDOW_OPENWINDOW,
00189 TAG_WIN_APP,gad->window->app,
00190 TAG_WIN_NAME,"Dropdown",
00191 TAG_WIN_EVENT_HANDLER,dropdown_subwin_event_handler,
00192 TAG_WIN_WINFLAGS,WIN_FLAGS_NOBORDER,
00193 TAG_WIN_FLAGS,GLWF_MAYBE_SMALL,
00194 TAG_WIN_GUI_FILE,this->gui_file,
00195 TAG_WIN_USERDATA,this,
00196 TAG_WIN_CHECKLIST,sub_checklist,
00197 TAG_WIN_PXWIDTH,gad->rect.width,
00198 TAG_WIN_PXHEIGHT,100,
00199 TAG_WIN_PXLEFT,gad->rect.left+r.left,
00200 TAG_WIN_PXTOP,gad->rect.top+gad->rect.height+r.top,
00201 TAG_WIN_PARENT,gad->window,
00202 TAG_DONE,0L);
00203 break;
00204 }
00205 case GLWEVD_LEFTUP:
00206 {
00207 if(((dropdown *)gad)->state==1)
00208 {
00209 ((dropdown *)gad)->state=0;
00210
00211
00212 ret=api->gadget_Call(GADGET_CALLBACK,TAG_GADGET_OBJECT,gad,TAG_GADGET_EVENT,CBK_GADGET_UP,TAG_GADGET_EVENT_DATA,0L,TAG_DONE);
00213 if(api->gui_Call(GUI_ISINSIDE,TAG_GUI_RECT,&gad->rect,TAG_GUI_X,event->mousex,TAG_GUI_Y,event->mousey,TAG_DONE)) ret|=api->gadget_Call(GADGET_CALLBACK,TAG_GADGET_OBJECT,gad,TAG_GADGET_EVENT,CBK_GADGET_CLICKED,TAG_GADGET_EVENT_DATA,0L,TAG_DONE);
00214 }
00215 break;
00216 }
00217 }
00218 break;
00219 }
00220 }
00221
00222 debug_End();
00223
00224 return(ret);
00225 }
00226
00227
00228 int dropdown_init_gadget(Gadget_t *this, tag *taglist)
00229 {
00230 int ret=-1;
00231
00232 debug_Begin();
00233
00234 ((dropdown *)this)->labels=common_strdup((char *)tag_GetTagData(taglist,TAG_DRP_LABELS,(u32)""));
00235 if(NULL==((dropdown *)this)->labels) ((dropdown *)this)->labels=empty;
00236 ((dropdown *)this)->state=0;
00237 if(NULL!=(((dropdown *)this)->gui_file=(char *)api->gui_Call(GUI_LOADSUBGADGETDESCRIPTOR,TAG_GUI_WIN,this->window,TAG_GUI_CLASS_NAME,this->class_data->class_name,TAG_DONE)))
00238 {
00239 ret=0;
00240 }
00241
00242 debug_End();
00243
00244 return(ret);
00245 }
00246
00247
00248 void dropdown_delete_gadget(Gadget_t *this)
00249 {
00250 debug_Begin();
00251
00252 if(NULL!=((dropdown *)this)->labels&&empty!=((dropdown *)this)->labels) mem_free(((dropdown *)this)->labels);
00253 if(((dropdown *)this)->gui_file!=NULL) api->gui_Call(GUI_UNLOADSUBGADGETDESCRIPTOR,TAG_GUI_FILE,((dropdown *)this)->gui_file,TAG_DONE);
00254
00255 debug_End();
00256 }
00257
00258
00259 static int dropdown_gadget_event_handler(Gadget_t *this, int event, tag *taglist)
00260 {
00261 int ret=-1;
00262
00263 debug_Begin();
00264
00265 if(this!=NULL&&event>=0)
00266 {
00267 switch(event)
00268 {
00269 case GADEV_INIT_GADGET:
00270 {
00271 ret=dropdown_init_gadget(this,taglist);
00272 break;
00273 }
00274 case GADEV_DELETE_GADGET:
00275 {
00276 dropdown_delete_gadget(this);
00277 ret=0;
00278 break;
00279 }
00280 case GADEV_GET_EXTENT:
00281 {
00282 Extent_t *min,*max,n,x;
00283 min=(Extent_t *)tag_GetTagData(taglist,TAG_GAD_EXTMIN,(u32)&n);
00284 max=(Extent_t *)tag_GetTagData(taglist,TAG_GAD_EXTMAX,(u32)&x);
00285 dropdown_get_extent(this,min,max);
00286 ret=0;
00287 break;
00288 }
00289 case GADEV_LAYOUT:
00290 case GADEV_DAMAGE:
00291 {
00292 Rect_t *rect,r;
00293 rect=(Rect_t *)tag_GetTagData(taglist,TAG_GAD_RECT,(u32)&r);
00294 dropdown_layout(this,rect);
00295 ret=0;
00296 break;
00297 }
00298 case GADEV_SAVE:
00299 {
00300
00301
00302
00303
00304
00305
00306
00307
00308
00309
00310
00311
00312 break;
00313 }
00314 case GADEV_RESTORE:
00315 {
00316
00317
00318
00319
00320
00321
00322
00323
00324
00325
00326
00327
00328
00329
00330 }
00331 }
00332 }
00333
00334 debug_End();
00335
00336 return(ret);
00337 }
00338
00339
00340
00341
00342
00343
00344 static void init_dropdown_class(u32 module)
00345 {
00346 api->gadget_Call(GADGET_REGISTER_CLASS,
00347 TAG_GADGET_CLASS_ID,CLASS_DROPDOWN_ID,
00348 TAG_GADGET_NAME,CLASS_DROPDOWN_NAME,
00349 TAG_GADGET_BINDING,binding,
00350 TAG_GADGET_COLOR_NAMES,color_names,
00351 TAG_GADGET_CUSTOM_NAMES,NULL,
00352 TAG_GADGET_STATE_MASK,GADSTF_NORMAL|GADSTF_PRESSED|GADSTF_FOCUSED,
00353 TAG_GADGET_MODULE,module,
00354 TAG_GADGET_GADGET_SIZE,sizeof(dropdown),
00355 TAG_GADGET_METHODS,NULL,
00356 TAG_GADGET_INPUT_EVENT_HANDLER,dropdown_input_event_handler,
00357 TAG_GADGET_EVENT_HANDLER,dropdown_event_handler,
00358 TAG_GADGET_GADGET_EVENT_HANDLER,dropdown_gadget_event_handler,
00359 TAG_DONE);
00360 }
00361
00362 EXPORT int module_Init(u32 module, bases_Modules_t *bases)
00363 {
00364 api=bases;
00365 init_dropdown_class(module);
00366 return(0);
00367 }