Main Page   Alphabetical List   Data Structures   File List   Data Fields   Globals  

gadget_Dropdown.c

Go to the documentation of this file.
00001 /*
00002  *    gui - [gega user interface] the flexible solution for user interface problems
00003  *    Copyright (C) 2002  Gergely Gati
00004  *
00005  *    This program is free software; you can redistribute it and/or modify
00006  *    it under the terms of the GNU General Public License as published by
00007  *    the Free Software Foundation; version 2 of the License.
00008  *
00009  *    This program is distributed in the hope that it will be useful,
00010  *    but WITHOUT ANY WARRANTY; without even the implied warranty of
00011  *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00012  *    GNU General Public License for more details.
00013  *
00014  *    You should have received a copy of the GNU General Public License
00015  *    along with this program; if not, write to the Free Software
00016  *    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00017  *
00018  *    Gergely Gati
00019  *      email:           g.gati@freemail.hu
00020  *      AIM screenname:  GatiGergely
00021  *      ICQ number:      93131690
00022  *
00023  */
00024 /*
00025  *  dropdown.c
00026  *
00027  *  Author            : Gergely Gáti
00028  *  Date              :
00029  *  Description       :
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  *  This function is always called after the Gadget_t has been created and
00086  *  attached to the Gadget_t tree, but before the call to dropdown_layout(). It may be
00087  *  called more than once. It must fill in the Gadget_t's minimum and maximum
00088  *  sizes into the supplied extent structures.
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  *  This function is called always after dropdown_get_extent() has been called at
00108  *  least once. It receives a position and an extent which determine the
00109  *  position and the size of the Gadget_t on the screen. This 4 is always
00110  *  between the minimum and maximum sizes which were returned by
00111  *  dropdown_get_extent() of the same gadget. After this call the Gadget_t is made
00112  *  visible.
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 //      if(sender->gadget_id==(GADGET_SUBGADGET_BASE+2)) ret=api->gadget_Call(GADGET_CALLBACK,TAG_GADGET_OBJECT,this,TAG_GADGET_EVENT,event,TAG_GADGET_EVENT_DATA,event_data,TAG_DONE);
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 //  else printf("DROPDOWN: sender=%ld -- EVENT: %d (DATA=%d)\n",gadget_id,event,(int)event_data);
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 //          api->window_Call(WINDOW_SETFOCUSEDGADGET,TAG_WIN_OBJECT,gad->window,TAG_WIN_GADGET,gad,TAG_DONE);
00184 //          api->gadget_Call(GADGET_SET_STATE,TAG_GADGET_OBJECT,gad,TAG_GADGET_STATE,GADST_PRESSED,TAG_GADGET_VISUAL,1,TAG_DONE);
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 //          api->window_Call(WINDOW_SETACTIVE,TAG_WIN_OBJECT,gad->window,TAG_WIN_GADGET,gad,TAG_DONE);
00187           // open its cool sub-window
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 //            api->gadget_Call(GADGET_SET_STATE,TAG_GADGET_OBJECT,gad,TAG_GADGET_STATE,GADST_FOCUSED,TAG_GADGET_VISUAL,1,TAG_DONE);
00211 //            api->window_Call(WINDOW_SETACTIVE,TAG_WIN_OBJECT,gad->window,TAG_WIN_GADGET,NULL,TAG_DONE);
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         u8 **mem;
00302         int *size;
00303         mem=(u8 **)tag_GetTagData(taglist,TAG_GADGET_MEM,0L);
00304         size=(int *)tag_GetTagData(taglist,TAG_GADGET_SIZE,0L);
00305         *size=strlen(((dropdown *)this)->label)+1;
00306         if(NULL!=(*mem=mem_malloc(*size)))
00307         {
00308           strcpy(*mem,((dropdown *)this)->label);
00309           ret=0;
00310         }
00311 */
00312         break;
00313       }
00314       case GADEV_RESTORE:
00315       {
00316 /*
00317         u8 *mem;
00318         int size;
00319         mem=(u8 *)tag_GetTagData(taglist,TAG_GADGET_MEM,0L);
00320         size=(int)tag_GetTagData(taglist,TAG_GADGET_SIZE,0L);
00321         if(NULL!=((dropdown *)this)->label&&empty!=((dropdown *)this)->label) mem_free(((dropdown *)this)->label);
00322         if(NULL!=(((dropdown *)this)->label=mem_malloc(size)))
00323         {
00324           strncpy(((dropdown *)this)->label,mem,size);
00325           ((dropdown *)this)->label_width=-1;
00326           ret=0;
00327         }
00328         break;
00329 */
00330       }
00331     }
00332   }
00333 
00334   debug_End();
00335 
00336   return(ret);
00337 }
00338 
00339 
00340 /*
00341  *  This function is called once before the creation of any Gadget_t of this
00342  *  class. Gadgets can be created only after this function has been called.
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 }

Generated on Tue Jan 7 12:11:19 2003 for THEGUI by doxygen1.2.14 written by Dimitri van Heesch, © 1997-2002