home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 13 / AACD13.ISO / AACD / Programming / MR_Classes / Dev / Source / palette / dispatch.c < prev    next >
Encoding:
C/C++ Source or Header  |  2000-07-24  |  8.1 KB  |  368 lines

  1. //#define DEBUG
  2. #include <debug.h>
  3.  
  4. #include "ui.h"
  5. #include "edata.h"
  6.  
  7. #include <clib/alib_protos.h>
  8. #include <clib/extras/string_protos.h>
  9.  
  10. #include <classes/requesters/palette.h>
  11.  
  12. #include <proto/intuition.h>
  13. #include <proto/exec.h>
  14. #include <proto/graphics.h>
  15. #include <proto/utility.h>
  16.  
  17. #include <exec/memory.h>
  18.  
  19. #include <math.h>
  20.  
  21.  
  22.  
  23. #include <tagitemmacros.h>
  24.  
  25. // OBSOLETE
  26.  
  27. ULONG soSetAttrs(Class *C, Object *Obj, struct opSet *Set);
  28. ULONG soGetAttrs(Class *C, Object *Obj, struct opGetAttrs *Get);
  29. ULONG soGetAttr(Class *C, Object *Obj, struct opGet *Get);
  30. STRPTR copystring(STRPTR Source, STRPTR *dest);
  31.  
  32. ULONG __saveds __asm EditorDispatcher(register __a0 Class *C, register __a2 Object *Obj, register __a1 Msg M, register __a6 struct Library *Lib)
  33. {
  34.   struct SData *sdata;
  35.   ULONG retval=0;
  36.  
  37. //  sdata=INST_DATA(C, Obj);
  38.  
  39.   switch(M->MethodID)
  40.   {
  41.     case OM_NEW:
  42.       //DKP("OM_NEW\n");
  43.       if(Obj=(Object *)DoSuperMethodA(C,Obj,(Msg)M))
  44.       {
  45.         sdata=INST_DATA(C, Obj);
  46.         
  47.         if(i_NewWindowObject(C,Obj,(APTR)M))
  48.         {
  49.           soSetAttrs(C,Obj,(struct opSet *)M);
  50.           retval=(ULONG)Obj;
  51.         }
  52.         else
  53.         {
  54.           retval=0;
  55.           DoSuperMethod(C,Obj,OM_DISPOSE);
  56.         }
  57.       }
  58.       break;
  59.  
  60.     case OM_DISPOSE:
  61.       //DKP("OM_DISPOSE\n");
  62. //      Delay(60);
  63.       i_DisposeWindowObject(C,Obj,(APTR)M);
  64.       //DKP("Window disposed\n");
  65. //      Delay(60);
  66.       retval=DoSuperMethodA(C,Obj,(Msg)M);
  67.       break;
  68.  
  69.     case OM_SET:
  70.       //DKP("OM_SET\n");
  71.       retval=soSetAttrs(C,Obj,(struct opSet *)M);
  72.       break;
  73.  
  74.     case OM_GET:
  75.       //DKP("OM_GET\n");
  76.       retval=soGetAttr(C,Obj,(struct opGet *)M);
  77.       break;
  78.  
  79.  
  80.  
  81. //    case OM_GETATTRS:
  82. //      retval=soGetAttrs(C,Obj,(struct opGetAttrs *)M);
  83.       break;
  84.  
  85.     case RM_DOREQUEST:
  86.       //DKP("MPEM_EDIT\n");
  87.       retval=i_OpenEditor(C,Obj,(APTR)M);      
  88. //      Delay(60);
  89.       //DKP("  end MPEM_EDIT\n");
  90. //      Delay(60);
  91.       break;
  92.       
  93. /*
  94.     case OM_DUPEOBJECT:
  95.       {
  96.         retval=soDupeObject(C, Obj);        
  97.       }
  98.       break;*/
  99. /*    case MPM_MATCHSCREEN:
  100. */    
  101.  
  102.  
  103.     default:
  104.       retval=DoSuperMethodA(C,Obj,(Msg)M);
  105.       break;
  106.   }
  107.   return(retval);
  108. }
  109.  
  110.  
  111. ULONG soSetAttrs(Class *C, Object *Obj, struct opSet *Set)
  112. {
  113.   struct EData *edata;
  114.   struct TagItem *tag,*tstate;
  115.   ULONG retval=0,data;
  116.  
  117.   edata=INST_DATA(C, Obj);
  118.   
  119.   ProcessTagList(Set->ops_AttrList,tag,tstate)
  120.   {
  121.     data=tag->ti_Data;
  122.     switch(tag->ti_Tag)
  123.     {
  124.      case PR_Screen:
  125.         //DKP("  PR_Screen %8lx\n",data);
  126.         edata->pr_Screen=(struct Screen *)data;
  127.  
  128.         edata->pr_Window=((struct Window *)data);
  129.         edata->pr_PubScreenName=(STRPTR)0;
  130.         
  131.         SetAttrs(edata->Win_Object, WA_CustomScreen,          data, 
  132.                                     WINDOW_Position,    WPOS_CENTERSCREEN,
  133.                                     TAG_DONE);
  134.  
  135.         break;
  136.  
  137.       case PR_Window:
  138.         //DKP("  PR_Window %8lx\n",data);
  139.         edata->pr_Window=((struct Window *)data);
  140.  
  141.         edata->pr_Screen=(struct Screen *)0;
  142.         edata->pr_PubScreenName=(STRPTR)0;
  143.  
  144.         SetAttrs(edata->Win_Object, WINDOW_RefWindow,   data, 
  145.                                     WINDOW_Position,    WPOS_CENTERWINDOW,
  146.                                     TAG_DONE);
  147.         break;
  148.         
  149.       case PR_PubScreenName:
  150.         //DKP("  PR_Window %8lx\n",data);
  151.         edata->pr_PubScreenName=(STRPTR)data;
  152.  
  153.         edata->pr_Window=((struct Window *)0);
  154.         edata->pr_Screen=(struct Screen *)0;
  155.  
  156.         SetAttrs(edata->Win_Object, WA_PubScreenName,   data,
  157.                                     WINDOW_Position,    WPOS_CENTERSCREEN,
  158.                                     TAG_DONE);
  159.  
  160.         break;
  161.    
  162.       case PR_Colors:
  163.         //DKP("  PR_Colors %ld\n",data);
  164.         
  165.         data=max(1,data);
  166.         data=min(data,256);
  167.         edata->pr_Colors=data;
  168.  
  169.         //SetGadgetAttrs(edata->G_Palette, edata->Window, 0, TCPALETTE_NumColors, data, TAG_DONE);
  170.         break;
  171.    
  172.       case PR_InitialPalette:
  173.         //DKP("  PR_InitialPalette %8lx\n",data);
  174.         {
  175.           struct prRGB *rgb;
  176.           ULONG l;
  177.           
  178.           rgb=(APTR)data;
  179.           
  180.           for(l=0;l<edata->pr_Colors;l++)
  181.             edata->pr_InitialPalette[l]=rgb[l];
  182.         }
  183.         break;
  184.         
  185. /*
  186.       case PR_ObtainPens:
  187.         //DKP("  PR_ObtainPens %8lx\n",data);
  188.         edata->pr_Flags|=PRFLAG_OBTAINPENS;
  189.         edata->pr_PenMode=PR_ObtainPens;
  190.         break;
  191.  
  192.       case PR_ObtainBestPens:
  193.         //DKP("  PR_ObtainBestPens %8lx\n",data);
  194.         edata->pr_PenMode=PR_ObtainBestPens;
  195.         break;
  196.         
  197.       case PR_ColorTable:
  198.         //DKP("  PR_ColorTable %8lx\n",data);
  199.         edata->pr_UserColorTable=(APTR)data;
  200.         edata->pr_PenMode=PR_ColorTable;
  201.         break;
  202. */
  203.         
  204.       case PR_TextAttr:
  205.         //DKP("  PR_TextAttr %8lx\n",data);
  206.         edata->pr_TextAttr=(APTR)data;
  207.         break;
  208.         
  209.       case PR_TitleText:
  210.         //DKP("  PR_Title %s\n",data);
  211.         edata->pr_TitleText=(APTR)data;
  212.         break;
  213.         
  214.       case PR_RedBits:
  215.         edata->pr_Flags&=(~PRFLAG_USER_REDBITS);
  216.         if(data)
  217.         {
  218.           edata->pr_RedBits=data;
  219.           edata->pr_Flags|=PRFLAG_USER_REDBITS;
  220.         }
  221.         break;
  222.         
  223.       case PR_GreenBits:
  224.         edata->pr_Flags&=(~PRFLAG_USER_GREENBITS);
  225.         if(data)
  226.         {
  227.           edata->pr_GreenBits=data;
  228.           edata->pr_Flags|=PRFLAG_USER_GREENBITS;
  229.         }
  230.         break;
  231.         
  232.       case PR_BlueBits:
  233.         edata->pr_Flags&=(~PRFLAG_USER_BLUEBITS);
  234.         if(data)
  235.         {
  236.           edata->pr_BlueBits=data;
  237.           edata->pr_Flags|=PRFLAG_USER_BLUEBITS;
  238.         }
  239.         break;
  240.         
  241.       case PR_ModeIDRGBBits:
  242.         {
  243.           struct DisplayInfo di;
  244.           
  245.           //DKP("  PR_ModeIDRGBBits %8x\n",data);
  246.           
  247.           if(GetDisplayInfoData(0,(UBYTE *)&di,sizeof(di),DTAG_DISP,data))
  248.           {
  249.             edata->pr_RedBits   =max(di.RedBits,1);
  250.             edata->pr_GreenBits =max(di.GreenBits,1);
  251.             edata->pr_BlueBits  =max(di.BlueBits,1);
  252.             
  253.             edata->pr_Flags|=PRFLAG_USER_REDBITS|PRFLAG_USER_GREENBITS|PRFLAG_USER_BLUEBITS;
  254.           }
  255.         }
  256.         break;
  257.         
  258.       case PR_InitialLeftEdge:
  259.         edata->pr_Flags&=(~PRFLAG_USER_LEFTEDGE);
  260.         if(data>=0)
  261.         {
  262.           edata->pr_Flags|=(PRFLAG_USER_LEFTEDGE);
  263.           edata->pr_InitialLeftEdge=data;
  264.         }
  265.         break;
  266.         
  267.       case PR_InitialTopEdge:
  268.         edata->pr_Flags&=(~PRFLAG_USER_TOPEDGE);
  269.         if(data>=0)
  270.         {
  271.           edata->pr_Flags|=(PRFLAG_USER_TOPEDGE);
  272.           edata->pr_InitialTopEdge=data;
  273.         }
  274.         break;
  275.         
  276.       case PR_InitialWidth:
  277.         edata->pr_Flags&=(~PRFLAG_USER_WIDTH);
  278.         if(data>=0)
  279.         {
  280.           edata->pr_Flags|=(PRFLAG_USER_WIDTH);
  281.           edata->pr_InitialWidth=data;
  282.         }
  283.         break;
  284.       case PR_InitialHeight:
  285.         edata->pr_Flags&=(~PRFLAG_USER_HEIGHT);
  286.         if(data>=0)
  287.         {
  288.           edata->pr_Flags|=(PRFLAG_USER_HEIGHT);
  289.           edata->pr_InitialHeight=data;
  290.         }
  291.         break;
  292.         
  293.       case PR_PositiveText:
  294.         edata->pr_PositiveText=data;
  295.         break;
  296.  
  297.       case PR_NegativeText:
  298.         edata->pr_NegativeText=data;
  299.         break;
  300.         
  301.         
  302.     } // endswitch()
  303.   }// in ProcessTagList()
  304.  
  305.   return(retval);
  306. }
  307.  
  308. ULONG soGetAttr(Class *C, Object *Obj, struct opGet *Get)
  309. {
  310.   struct EData *edata;
  311. /*
  312.   union 
  313.   {
  314.     struct TTextAttr *ta;
  315.     struct RGB *rgb;
  316.     APTR   aptr;
  317.     STRPTR strptr;
  318.     ULONG  ulong;
  319.   } *data;
  320.   */
  321.  
  322.   ULONG retval=0;
  323.  
  324.   edata=INST_DATA(C, Obj);
  325.   
  326.   switch(Get->opg_AttrID)
  327.   {
  328.     case PR_Palette:
  329.       GetAttr(TCPALETTE_RGBPalette, edata->G_Palette, Get->opg_Storage);
  330.       retval=1;
  331.       break;
  332.   }
  333.   return(retval);
  334. }
  335.  
  336.  
  337.  
  338. STRPTR copystring(STRPTR Source, STRPTR *dest)
  339. {
  340.   STRPTR ns;
  341.  
  342.   if(Source)
  343.   {
  344.     if(ns=CopyString(Source,MEMF_PUBLIC))
  345.     {
  346.       FreeVec(*dest);
  347.       *dest=ns;
  348.       return(ns);
  349.     }
  350.     else
  351.     {
  352.       FreeVec(*dest);
  353.       *dest=0;
  354.     }
  355.   }
  356.   return(*dest);
  357. }
  358.  
  359.  
  360. struct PData
  361. {
  362.   struct SData  *SData;
  363.   struct Screen *Screen;
  364.   WORD   Width,Height,Depth;
  365. };
  366.  
  367.  
  368.