home *** CD-ROM | disk | FTP | other *** search
/ Amiga Times / AmigaTimes.iso / demos / programme / Wildfire_PPC / Bonus / draggadget_r1.0b2 / droptest.c < prev    next >
Encoding:
C/C++ Source or Header  |  1998-10-06  |  6.4 KB  |  183 lines

  1. #include "include/gadgets/drag.h"
  2. #include <intuition/gadgetclass.h>
  3.  
  4. #include <proto/intuition.h>
  5. #include <proto/exec.h>
  6. #include <proto/icon.h>
  7. #include "proto/drag.h"
  8.  
  9. struct IntuitionBase *IntuitionBase;
  10. struct Library *IconBase;
  11. struct ClassLibrary *DragBase;
  12.  
  13. static ULONG __saveds __asm Dispatcher(register __a0 struct IClass *class,
  14.                                        register __a2 Object *obj,
  15.                                        register __a1 Msg msg );
  16.  
  17. struct ClassLibrary *fstrc;
  18.  
  19. struct IClass *CreateSClass(void)
  20. {
  21.   struct IClass *cl=NULL;
  22.  
  23.   if(fstrc=(struct ClassLibrary*)OpenLibrary("gadgets/string.gadget",40))
  24.     if(cl=MakeClass(NULL,NULL,fstrc->cl_Class,0,0))
  25.       cl->cl_Dispatcher.h_Entry=(HOOKFUNC)Dispatcher;
  26.   return cl;
  27. }
  28.  
  29. void FreeSClass(struct IClass *c)
  30. {
  31.   if(c)
  32.     FreeClass(c);
  33.   if(fstrc)
  34.     CloseLibrary((struct Library*)fstrc);
  35. }
  36.  
  37. main()
  38. {
  39.   struct Gadget *dg1,*dg2;
  40.   struct Gadget *str;
  41.   struct Window *win,*win2=NULL;
  42.   APTR context,dw2;
  43.   struct IntuiMessage *msg;
  44.   struct IClass *dc,*strc=NULL;
  45.   struct DiskObject *icon,*icon2=NULL;
  46.   struct Image *image,*image2,*image3,*image4;
  47.   BOOL done=FALSE;
  48.  
  49.   if(DragBase=(struct ClassLibrary*)OpenLibrary("gadgets/drag.gadget",40))
  50.   {
  51.     dc=DragBase->cl_Class;
  52.  
  53.     if( (IntuitionBase=(struct IntuitionBase*)OpenLibrary("intuition.library",37)) &&
  54.         (IconBase=OpenLibrary("icon.library",37)) &&
  55.         (strc=CreateSClass()) )
  56.     {
  57.       if((win=OpenWindowTags(NULL,WA_Left,100,
  58.                                   WA_Top,100,
  59.                                   WA_Width,200,
  60.                                   WA_Height,120,
  61.                                   WA_MaxWidth,~0,
  62.                                   WA_MaxHeight,~0,
  63.                                   WA_Title,(ULONG)"drag&drop-test",
  64.                                   WA_IDCMP,IDCMP_CLOSEWINDOW,
  65.                                   WA_CloseGadget,TRUE,
  66.                                   WA_SizeGadget,TRUE,
  67.                                   WA_DragBar,TRUE,
  68.                                   WA_DepthGadget,TRUE,
  69.                                   WA_SimpleRefresh,TRUE,
  70.                                   WA_NoCareRefresh,TRUE,NULL)) &&
  71.         (win2=OpenWindowTags(NULL,WA_Left,320,
  72.                                   WA_Top,120,
  73.                                   WA_Width,200,
  74.                                   WA_Height,80,
  75.                                   WA_Title,(ULONG)"string",
  76.                                   WA_DragBar,TRUE,
  77.                                   WA_DepthGadget,TRUE,
  78.                                   WA_SimpleRefresh,TRUE,
  79.                                   WA_NoCareRefresh,TRUE,NULL)))
  80.       {
  81.         context=CreateDContext(win->WScreen);
  82.         dw2=AddDropWindow(context,2,0,win2,NULL);
  83.  
  84.         if( (icon=GetDiskObject("sys:prefs/locale")) &&
  85.             (icon2=GetDiskObject("sys:prefs/palette")) )
  86.         {
  87.           image=icon->do_Gadget.GadgetRender;
  88.           image2=icon->do_Gadget.SelectRender;
  89.           image3=icon2->do_Gadget.GadgetRender;
  90.           image4=icon2->do_Gadget.SelectRender;
  91.           if(dg1=NewObject(dc,NULL,GA_RelRight,-180,
  92.                                    GA_RelBottom,-100,
  93.                                    GA_ID,1,
  94.                                    GA_UserData,(ULONG)"sys:prefs/locale",
  95.                                    DGA_Context,context,
  96.                                    GA_Image,(ULONG)image,
  97.                                    GA_SelectRender,(ULONG)image2,
  98.                                    GA_Highlight,(icon->do_Gadget.Flags) & GFLG_GADGHIGHBITS,
  99.                                    NULL))
  100.           {
  101.             if(dg2=NewObject(dc,NULL,GA_RelRight,-180,
  102.                                      GA_RelBottom,-50,
  103.                                      GA_ID,2,
  104.                                      GA_UserData,(ULONG)"sys:prefs/palette",
  105.                                      GA_Previous,(ULONG)dg1,
  106.                                      DGA_Context,context,
  107.                                      GA_Image,(ULONG)image3,
  108.                                      GA_SelectRender,(ULONG)image4,
  109.                                      GA_Highlight,(icon2->do_Gadget.Flags) & GFLG_GADGHIGHBITS,
  110.                                      NULL))
  111.             {
  112.               if(str=NewObject(strc,NULL,GA_Left,20,
  113.                                          GA_Top,40,
  114.                                          GA_Width,140,
  115.                                          GA_Height,19,
  116.                                          GA_ID,3,
  117.                                          STRINGA_TextVal,(ULONG)"",
  118.                                          STRINGA_MaxChars,SG_DEFAULTMAXCHARS-1,
  119.                                          NULL))
  120.               {
  121.                 AddGList(win,dg1,-1,-1,NULL);
  122.                 RefreshGList(dg1,win,NULL,-1);
  123.                 AddGList(win2,str,-1,-1,NULL);
  124.                 RefreshGList(str,win2,NULL,-1);
  125.                 while(!done)
  126.                 {
  127.                   WaitPort(win->UserPort);
  128.                   while(msg=(struct IntuiMessage*)GetMsg(win->UserPort))
  129.                   {
  130.                     if(msg->Class==IDCMP_CLOSEWINDOW)
  131.                         done=TRUE;
  132.  
  133.                     ReplyMsg((struct Message*)msg);
  134.                   }
  135.                 }
  136.                 RemoveGList(win,dg1,-1);
  137.                 RemoveGList(win2,str,-1);
  138.  
  139.                 DisposeObject(str);
  140.               }
  141.               DisposeObject(dg2);
  142.             }
  143.             DisposeObject(dg1);
  144.           }
  145.         }
  146.         if(icon) FreeDiskObject(icon);
  147.         if(icon2) FreeDiskObject(icon2);
  148.  
  149.         RemoveDropWindow(dw2);
  150.         DeleteDContext(context);
  151.       }
  152.       if(win)CloseWindow(win);
  153.       if(win2)CloseWindow(win2);
  154.     }
  155.     if(strc) FreeSClass(strc);
  156.     if(IntuitionBase) CloseLibrary((struct Library*)IntuitionBase);
  157.     if(IconBase) CloseLibrary(IconBase);
  158.  
  159.     CloseLibrary((struct Library*)DragBase);
  160.   }
  161. }
  162.  
  163. static ULONG __saveds __asm Dispatcher(register __a0 struct IClass *class,
  164.                                        register __a2 Object *obj,
  165.                                        register __a1 Msg msg )
  166. {
  167.   ULONG ret=DoSuperMethodA(class,obj,msg);
  168.  
  169.   if(msg->MethodID == OM_DROPACTION)
  170.   {
  171.     struct opDropAction *dm=(struct opDropAction*)msg;
  172.     struct TagItem attrs[2];
  173.  
  174.     attrs[0].ti_Tag=STRINGA_TextVal;
  175.     attrs[0].ti_Data=(ULONG)(dm->opda_DragInfo->userdata);
  176.     attrs[1].ti_Tag=NULL;
  177.  
  178.     ret=DoMethod(obj,OM_SET,attrs,dm->opda_GInfo);
  179.   }
  180.  
  181.   return ret;
  182. }
  183.