home *** CD-ROM | disk | FTP | other *** search
/ Aminet 18 / aminetcdnumber181997.iso / Aminet / dev / gui / relative.lha / Relative / DaGuru.c next >
Encoding:
C/C++ Source or Header  |  1997-02-10  |  25.3 KB  |  786 lines

  1. /**************************************************************************************************
  2. ** DaGuru GUI
  3. ***************************************************************************************************
  4. ** Preview of DaGuru GUI made up with relgroup.gadget and other gadget classes.
  5. ** The use of relgroup.class allows layout to be adjusted without the program having
  6. ** to worry about it.
  7. **
  8. ** History:
  9. ** 20.08.1996    40.0    - Made GUI.
  10. **            - Added CX handling.
  11. **            - Doesn't free menus&gadgets when hiding for speed.
  12. ** 09.09.1996    40.1    - Added slider and up/down gadgets with object-interconnection
  13. **              through the modelclass subclass value.model.
  14. ** 25.01.1997    40.2    - Fixed gadget communications.
  15. ** 11.02.1997    40.3    * Aminet Developer Release.
  16. **
  17. **************************************************************************************************/
  18. #define DEBUG_IT     1                /* >0 = ON ,0 = OFF */
  19. #define DEBUG_WAIT     0                /* 1/5th seconds to wait */
  20. #define NAME        "DaGuru GUI"
  21. #define CODER        "Jeroen Massar"
  22. #define REL        "4.0"
  23. #define VER        "40.3"
  24. #define DATE        "11.02.97"
  25. #define COPYYEARS    "1996-1997"
  26.  
  27. #include "DaGuru.h"
  28. #include <gadgets/relgroup.h>
  29. #include <gadgets/relbutton.h>
  30. #include <gadgets/virtual.h>
  31. #include <models/value.h>
  32.  
  33. /**************************************************************************************************
  34. ** Debug Stuff
  35. **************************************************************************************************/
  36. #define DEBUGNAME NAME
  37. #include <Shorsha:Cee/Debug.h>
  38.  
  39. static const char ProgName[]    = NAME;
  40. static const char WinTitle[]    = NAME " " REL;
  41. static const char ScrTitle[]    = NAME " " REL " ©" COPYYEARS " by " CODER;
  42. static const char Version[]    = "$VER: " NAME " " REL " (" DATE ")";
  43. static const char AboutTxT[]    = \
  44.                 NAME " " REL "\n"\
  45.                 "by " CODER "\n"\
  46.                 "\n"\
  47.                 "Revision         : " VER "\n"\
  48.                 "Date             : " DATE "\n"\
  49.                 "\n"\
  50.                 "RelGroup.gadget  : %ld.%ld\n"\
  51.                 "RelButton.gadget : %ld.%ld\n"\
  52.                 "Virtual.gadget   : %ld.%ld\n"\
  53.                 "Value.model      : %ld.%ld\n"\
  54.                 "ReqTools.library : %ld.%ld";
  55.  
  56. /**************************************************************************************************
  57. ** Id's
  58. **************************************************************************************************/
  59. enum {    ID_PROJECT=666,
  60.     ID_PRJ_ABOUT,
  61.     ID_PRJ_HIDE,
  62.     ID_PRJ_QUIT,
  63.  
  64.     ID_GAD_CALENDAR,
  65.     ID_GAD_STATUS,
  66.     ID_GAD_PROP,
  67.     ID_GAD_PROP_UP,
  68.     ID_GAD_PROP_DOWN,
  69.  
  70.     ID_GAD_NUM,
  71.  
  72.     ID_GAD_NO_0,
  73.     ID_GAD_NO_1,
  74.     ID_GAD_NO_2,
  75.     ID_GAD_NO_3,
  76.     ID_GAD_NO_4,
  77.     ID_GAD_NO_5,
  78.     ID_GAD_NO_6,
  79.     ID_GAD_NO_7,
  80.     ID_GAD_NO_8,
  81.     ID_GAD_NO_9,
  82.     ID_GAD_NO_A,
  83.     ID_GAD_NO_B,
  84.     ID_GAD_NO_C,
  85.     ID_GAD_NO_D,
  86.     ID_GAD_NO_E,
  87.     ID_GAD_NO_F,
  88.  
  89.     ID_GAD_LIST,
  90.     ID_GAD_LAST,
  91.     ID_GAD_GET,
  92.     ID_GAD_RESET,
  93.     ID_GAD_GURUDOS,
  94.     };
  95.  
  96. #define MENU_TITLE(txt)    {NM_TITLE,txt,0,0,0,0}
  97. #define MENU_HEAD(txt)    {NM_ITEM,txt,0,0,0,0}
  98. #define MENU_BAR    {NM_ITEM,NM_BARLABEL,0,0,0,0}
  99. #define MENU_SUBBAR    {NM_SUB,NM_BARLABEL,0,0,0,0}
  100. #define MENU_END    {NM_END,0,0,0,0,0,}
  101.  
  102. #define RB  CHECKIT|MENUTOGGLE
  103. #define RBC CHECKIT|MENUTOGGLE|CHECKED
  104. #define TG  CHECKIT
  105. #define TGC CHECKIT|CHECKED
  106. #define IDISABLED NM_ITEMDISABLED
  107.  
  108. struct NewMenu MainMenu[] =
  109. {
  110.     MENU_TITLE("Project"),
  111.     {  NM_ITEM,"About..."                ,"?",0    ,0        ,(APTR)ID_PRJ_ABOUT    },
  112.     {  NM_ITEM,"Hide..."                ,"H",0    ,0        ,(APTR)ID_PRJ_HIDE    },
  113.     {  NM_ITEM,"Quit..."                ,"Q",0    ,0        ,(APTR)ID_PRJ_QUIT    },
  114.  
  115.     MENU_END
  116. };
  117.  
  118. /**************************************************************************************************
  119. ** Global Variables
  120. **************************************************************************************************/
  121. extern struct Library    *SysBase,*DOSBase,*UtilityBase,*IconBase;
  122. struct GfxBase        *GfxBase=NULL;
  123. struct IntuitionBase    *IntuitionBase=NULL;
  124. struct Library        *GadToolsBase=NULL,*ReqToolsBase=NULL,*CxBase=NULL,
  125.             *RGrpGadBase=NULL,*RButGadBase=NULL,*VirtGadBase=NULL,*CalGadBase=NULL,*ValModelBase=NULL;
  126. ULONG            RGrp_AttrStart,RBut_AttrStart,Virt_AttrStart,ValM_AttrStart,
  127.             OldLeft=0,OldTop=0,OldWidth=0,OldHeight=0,cxsigflag=NULL;
  128. struct Screen        *scr=NULL;
  129. struct Menu        *menu=NULL;
  130. struct Window        *win=NULL,*oldprocwinptr=NULL;
  131. void            *vi=NULL;
  132. struct DrawInfo        *dri=NULL;
  133. struct Gadget        *gad,*prop;
  134. struct Object        *propmodel;
  135. #define PubScreenLen 255
  136. char            PubScreenName[PubScreenLen] = "";
  137. CxObj            *Broker=NULL;
  138. struct MsgPort        *BrokerMP=NULL;
  139.  
  140. struct NewBroker newbroker = {  NB_VERSION,(STRPTR)&ProgName,(STRPTR)&Version[6],(STRPTR)"Tests new GUI",
  141.                 /*NBU_NOTIFY|NBU_UNIQUE*/0,COF_SHOW_HIDE,0,0,0};
  142. static const UWORD ZoomData[4] = {0,0,100,10};
  143.  
  144. /**************************************************************************************************
  145. ** Show Error Messages.
  146. **************************************************************************************************/
  147. void ShowErr(char *TxT, ...)
  148. {
  149.     APTR arg=(ULONG *)(((ULONG *)&TxT)+1);
  150.     D(bugA(TxT,arg));
  151.     if (ReqToolsBase)
  152.     {
  153.         struct TagItem Tags[] = {    RTEZ_ReqTitle,(ULONG)NAME " Whoopy...",
  154.                         RT_LockWindow,TRUE,
  155.                         TAG_DONE,NULL    };
  156.         rtEZRequestA(TxT,"Ok",NULL,arg,(struct TagItem *)&Tags);
  157.     }
  158.     else
  159.     {
  160.         VPrintf(TxT,arg);
  161.         PutStr("\n");            /* Add return */
  162.     }
  163. }
  164.  
  165. STRPTR DOSErr(void)
  166. {
  167.     static char TxT[125];
  168.     Fault(IoErr(),"DOS-Error ",(STRPTR)&TxT,125);
  169.     return(TxT);
  170. }
  171.  
  172. /**************************************************************************************************
  173. ** Short routines.
  174. **************************************************************************************************/
  175. #define CloseLib(lib) if (lib){ CloseLibrary((struct Library *)lib); lib=NULL;}
  176.  
  177. ULONG DoClassLibraryMethod (struct ClassLibrary *cl, Msg msg)
  178. {
  179.     return (CallHookPkt(&cl->cl_Class->cl_Dispatcher,(APTR)cl->cl_Class,(APTR)msg));
  180. }
  181.  
  182. struct MenuItem *FindUData(struct Menu *menu,ULONG id)
  183. {
  184.     BOOL found=FALSE;
  185.     struct MenuItem *item=NULL,*sub=NULL;
  186.     while (!found&&menu)
  187.     {
  188.         item=menu->FirstItem;
  189.         while (!found&&item&&(!(found=((ULONG)GTMENUITEM_USERDATA(item)==id))))
  190.         {
  191.             for (sub=item->SubItem;(sub&&(!(found=((ULONG)GTMENUITEM_USERDATA(sub)==id))));sub=sub->NextItem);
  192.             if (!found) item=item->NextItem;
  193.         }
  194.         if (!found) menu=menu->NextMenu;
  195.     }
  196.     return((sub ? sub : item));
  197. }
  198.  
  199. #define MenuFind(id) FindUData(menu,id)
  200. #define freevec(m) if (m) {FreeVec(m); m=NULL;}
  201. #define checked(id) ((MenuFind(id)->Flags&CHECKED)>>8)
  202. #define get(obj,attr,store) GetAttr(attr,obj,(ULONG *)store)
  203. #define set(obj,attr,value) SetAttrs(obj,attr,value,TAG_DONE)
  204. #define setg(win,obj,attr,value) SetGadgetAttrs((struct Gadget *)obj,win,NULL,attr,value,TAG_DONE)
  205. #define DisObj(obj) if (obj) {DisposeObject(obj); obj=NULL;}
  206.  
  207. void setcheck(ULONG id,BOOL state)
  208. {
  209.     struct MenuItem *it;
  210.     it=MenuFind(id);
  211.     it->Flags&=~CHECKED;        /* Clear CHECKED bit */
  212.     it->Flags|=(state&1)<<8;    /* Set/Clear CHECKED bit */
  213. }
  214.  
  215. ULONG xget(Object *obj,ULONG attr)
  216. {
  217.     ULONG store;
  218.     get(obj,attr,&store);
  219.     return(store);
  220. }
  221.  
  222. /**************************************************************************************************
  223. ** Open/Close Needed Libraries
  224. **************************************************************************************************/
  225. BOOL OpenLibs(void)
  226. {
  227.     GfxBase        = (struct GfxBase *)        OpenLibrary("graphics.library"    , 39L);
  228.     IntuitionBase    = (struct IntuitionBase *)    OpenLibrary("intuition.library"    , 39L);
  229.     ReqToolsBase    =                 OpenLibrary("reqtools.library"    , REQTOOLSVERSION);
  230.     GadToolsBase    =                 OpenLibrary("gadtools.library"    , 39L);
  231.     return((BOOL)(GfxBase&&IntuitionBase&&ReqToolsBase&&GadToolsBase ? TRUE : FALSE));
  232. }
  233.  
  234. void CloseLibs(void)
  235. {
  236.     CloseLib(GadToolsBase);
  237.     CloseLib(ReqToolsBase);
  238.     CloseLib(IntuitionBase);
  239.     CloseLib(GfxBase);
  240. }
  241.  
  242. /**************************************************************************************************
  243. ** DoReadArgs (for cli-parameters which override normal ones)
  244. **************************************************************************************************/
  245. BOOL DoReadArgs(void)
  246. {
  247.     char Template[]    = "PS=PUBSCREEN/K,TESTGURU/S,CLEARGURU/S";
  248.     char Help[]    = "PubScreen  - Name of public-screen to open on.\n"\
  249.               "TestGuru   - This option, when enabled will test for a last\n"\
  250.               "             Guru and if there was one then the main window\n"\
  251.               "             will be opened, if there weren't any gurus then\n"
  252.               "             nothing will be shown onscreen\n"\
  253.               "ClearGuru  - Clears guru on exit\n";
  254.     struct ArgArray {
  255.         STRPTR    PubScreen;
  256.         ULONG    TestGuru;
  257.         ULONG    ClearGuru;
  258.     } argarray = {0,0,0};
  259.     struct RDArgs *rda,*rdas;
  260.     BOOL    ret=FALSE;
  261.  
  262.     if (rdas = AllocDosObject(DOS_RDARGS,NULL))
  263.     {
  264.         rdas->RDA_ExtHelp = (char *)&Help;
  265.         if (rda = ReadArgs((char *)&Template,(LONG *)&argarray,rdas))
  266.         {
  267.             if (argarray.PubScreen)
  268.             {
  269.                 int x;
  270.                 char *to=(char *)&PubScreenName,*from=(char *)argarray.PubScreen;
  271.                 for (x=PubScreenLen;x>0&&from[0]!=0;to++,from++) to[0]=from[0];
  272.             }
  273.             ret=TRUE;
  274.         }
  275.         FreeArgs(rda);
  276.         FreeDosObject(DOS_RDARGS,rdas);
  277.     }
  278.  
  279.     if (!ret)
  280.     {
  281.         char TxT[125];
  282.         Fault(IoErr(),"DOS-Error ",(STRPTR)&TxT,125);
  283.         ShowErr((STRPTR)&TxT);
  284.     }
  285.     return(ret);
  286. }
  287.  
  288. /**************************************************************************************************
  289. ** Open/Close Window & Setup/Dispose Gadgets
  290. **************************************************************************************************/
  291. void FreeGads(void)
  292. {
  293.     DisObj(gad);
  294.     /*DisObj(propmodel);*/
  295.     CloseLib(ValModelBase);
  296.     CloseLib(CalGadBase);
  297.     CloseLib(VirtGadBase);
  298.     CloseLib(RButGadBase);
  299.     CloseLib(RGrpGadBase);
  300. }
  301.  
  302. /************************************************
  303.  Some handy GUI creation macros.
  304. ************************************************/
  305. #define End        TAG_DONE)
  306. #define Virtual        NewObject(NULL,VIRTUALGADGET_NAME,Virt_AttrStart+RGrpA_Frame,NULL,GA_Immediate,TRUE,GA_RelVerify,TRUE,GA_TextAttr,scr->Font
  307. #define VChildG        Virt_AttrStart+VirtA_ChildGadget
  308. #define VChildI        Virt_AttrStart+VirtA_ChildImage
  309. #define Group        NewObject(NULL,RELGROUPGADGET_NAME,RGrp_AttrStart+RGrpA_Frame,NULL,GA_TextAttr,scr->Font
  310. #define GroupV        Group,RGrp_AttrStart+RGrpA_Orientation,RGrpV_Orientation_Vertical
  311. #define GroupH        Group,RGrp_AttrStart+RGrpA_Orientation,RGrpV_Orientation_Horizontal
  312. #define GroupU(c,r)    Group,RGrp_AttrStart+RGrpA_Orientation,RGrpV_Orientation_User,\
  313.             RGrp_AttrStart+RGrpA_Columns,c,RGrp_AttrStart+RGrpA_Rows,r
  314. #define Child        RGrp_AttrStart+RGrpA_Child
  315.  
  316. #define RButO(id,label)    NewObject(NULL,RELBUTTONGADGET_NAME,\
  317.                         GA_ID,                id,\
  318.                         ICA_TARGET,            ICTARGET_IDCMP,\
  319.                         RBut_AttrStart+RButA_Label,    label,\
  320.                         GA_RelVerify,            FALSE,\
  321.                         GA_Immediate,            TRUE,\
  322.                         GA_TextAttr,            scr->Font
  323. #define RBut(id,label)    RButO(id,label),End
  324. #define RButD(id,label,dis)\
  325.             RButO(id,label),GA_Disabled,dis,End
  326. #define RButT(id,label,sel,dis)\
  327.             RButO(id,label),GA_ToggleSelect,TRUE,GA_Selected,sel,GA_Disabled,dis,End
  328. #define RButT2(id,label,label2,sel)\
  329.             RButO(id,label),GA_ToggleSelect,TRUE,GA_Selected,sel,RBut_AttrStart+RButA_LabelSel,label2,End
  330. #define StrI(id,n)    NewObject(NULL,"strgclass",GA_ID,id,STRINGA_LongVal,n,STRINGA_NoFilterMode,TRUE,STRINGA_MaxChars,15,STRINGA_Justification,GACT_STRINGCENTER,GA_TextAttr,scr->Font,GA_Immediate,TRUE,GA_RelVerify,TRUE,TAG_DONE)
  331. #define PropGad(id,free,top,vis,tot/*,target,map*/)\
  332.             Group,    RGrp_AttrStart+RGrpA_Frame,RGrpV_Frame_Default,IA_FrameType,FRAME_BUTTON,\
  333.                 Child,    NewObject(NULL,"propgclass",GA_ID,id,GA_Width,1,GA_Height,1,PGA_NewLook,TRUE,PGA_Freedom,free,PGA_Top,top,PGA_Total,tot,PGA_Visible,vis,PGA_Borderless,FALSE,\
  334.                     GA_Immediate,TRUE,GA_RelVerify,TRUE,GA_TextAttr,scr->Font,/*ICA_TARGET,target,ICA_MAP,map,*/TAG_DONE),\
  335.             End
  336. #define ImageGad(id,which/*,target,map*/)\
  337.             NewObject(NULL,"buttongclass",GA_ID,id,GA_Width,1,GA_Height,1,\
  338.                 GA_Image,NewObject(NULL,"sysiclass",SYSIA_Size,SYSISIZE_MEDRES,SYSIA_Which,which,SYSIA_DrawInfo,dri,SYSIA_ReferenceFont,scr->Font,TAG_DONE),\
  339.                 GA_TextAttr,scr->Font,GA_Immediate,TRUE,GA_RelVerify,TRUE,\
  340.                 /*ICA_TARGET,target,ICA_MAP,map,*/TAG_DONE)
  341. /*#define CalGad(id)    NewObject(NULL,"calendar.gadget",GA_ID,id,GA_RelVerify,TRUE,GA_Immediate,TRUE/*,ICA_TARGET,ICTARGET_IDCMP*/,GA_TextAttr,scr->Font,TAG_DONE)*/
  342. #define ValueMod(val,step,min,max)\
  343.             NewObject(NULL,VALUEMODEL_NAME,ValM_AttrStart+ValMA_Value,val,ValM_AttrStart+ValMA_Step,step,ValM_AttrStart+ValMA_Min,min,ValM_AttrStart+ValMA_Max,max,ICA_TARGET,ICTARGET_IDCMP,ICA_MAP,modelmap,TAG_DONE)
  344. /***********************************************/
  345.  
  346. /* IC maps */
  347. /*ULONG propmap[]        = {    PGA_TOP,    ValMA_Value,    TAG_DONE };
  348. ULONG upmap[]        = {    GA_ID,        ValMA_Decr,    TAG_DONE };
  349. ULONG downmap[]        = {    GA_ID,        ValMA_Incr,    TAG_DONE };
  350. ULONG propmodmap[]    = {    ValMA_Value,    PGA_Top,
  351.                 ValMA_Max,    PGA_Total,
  352.                 ValMA_Step,    PGA_Visible,    TAG_DONE };
  353. ULONG modelmap[]    = {    TAG_DONE };
  354.  
  355. #define UpdateMapA(map) map[1]+=ValM_AttrStart
  356. #define UpdateMapB(map) map[0]+=ValM_AttrStart; map[2]+=ValM_AttrStart; map[4]+=ValM_AttrStart
  357.  
  358. BOOL IC(struct Object *target,ULONG *map,struct Object *model)
  359. {
  360.     struct Object *ic;
  361.     BOOL ret=FALSE;
  362.     if (ic=NewObject(NULL,ICCLASS,ICA_TARGET,target,ICA_MAP,map,TAG_DONE))
  363.     {
  364.         D(bug("Adding IC..."));
  365.         DoMethod((Object *)model,OM_ADDMEMBER,ic);
  366.         ret=TRUE;
  367.     }
  368.     return(ret);
  369. }
  370. */
  371.  
  372. BOOL MakeGads(void)
  373. {
  374.     ULONG msg = OM_ATTRSTART;
  375.     BOOL ret=FALSE;
  376.     if ((RGrpGadBase = OpenLibrary(RELGROUPGADGET_LIBPATH RELGROUPGADGET_NAME,RELGROUPGADGET_VMIN))&&
  377.         (RButGadBase  = OpenLibrary(RELBUTTONGADGET_LIBPATH RELBUTTONGADGET_NAME,RELBUTTONGADGET_VMIN))&&
  378.         (VirtGadBase  = OpenLibrary(VIRTUALGADGET_LIBPATH VIRTUALGADGET_NAME,VIRTUALGADGET_VMIN))&&
  379.         /*(CalGadBase   = OpenLibrary("gadgets/calendar.gadget",37))&&*/
  380.         (ValModelBase = OpenLibrary(VALUEMODEL_LIBPATH VALUEMODEL_NAME,VALUEMODEL_VMIN)))
  381.     {
  382.         RGrp_AttrStart=DoClassLibraryMethod((struct ClassLibrary *)RGrpGadBase,(Msg)&msg);
  383.         RBut_AttrStart=DoClassLibraryMethod((struct ClassLibrary *)RButGadBase,(Msg)&msg);
  384.         Virt_AttrStart=DoClassLibraryMethod((struct ClassLibrary *)VirtGadBase,(Msg)&msg);
  385.         ValM_AttrStart=DoClassLibraryMethod((struct ClassLibrary *)ValModelBase,(Msg)&msg);
  386. /*        UpdateMapA(propmap);
  387.         UpdateMapA(upmap);
  388.         UpdateMapA(downmap);
  389.         UpdateMapB(propmodmap);
  390.  
  391.         if ((propmodel=ValueMod(1,1,0,100))&&*/
  392.  
  393.         if    (gad = GroupV,
  394.                 Child,    GroupH,
  395.                     Child, Virtual,
  396.                         Virt_AttrStart+VirtA_Virtual,VirtV_Virtual_Always,
  397.                         VChildG,RButO(ID_GAD_STATUS,"Status"),
  398.                             GA_ReadOnly,TRUE,
  399.                             IA_Recessed,TRUE,
  400.                         End,
  401.                     End,
  402.                     /*Child, CalGad(ID_GAD_CALENDAR),*/
  403.                     RGrp_AttrStart+RGrpA_Weight,RGrpV_Weight_NoXReSize,
  404.                     Child, GroupV,
  405.                         Child,    prop=PropGad(ID_GAD_PROP,FREEVERT,1,1,100/*,propmodel,propmap*/),
  406.                         RGrp_AttrStart+RGrpA_Weight,RGrpV_Weight_NoYReSize,
  407.                         Child,    ImageGad(ID_GAD_PROP_UP  ,UPIMAGE  /*,propmodel,upmap*/),
  408.                         Child,    ImageGad(ID_GAD_PROP_DOWN,DOWNIMAGE/*,propmodel,downmap*/),
  409.                     End,
  410.                 End,
  411.                 RGrp_AttrStart+RGrpA_Weight,RGrpV_Weight_NoYReSize,
  412.                 Child,    GroupH,
  413.                     Child,    GroupV,
  414.                         RGrp_AttrStart+RGrpA_Weight,RGrpV_Weight_NoYReSize,
  415.                         Child,    GroupH,
  416.                             RGrp_AttrStart+RGrpA_Weight,RGrpV_Weight_NoXReSize,
  417.                             Child,    RButO(ID_GAD_GURUDOS,"Hex:"),
  418.                                 GA_ReadOnly,    TRUE,
  419.                                 IA_Recessed,    TRUE,
  420.                                 IA_FrameType,    FRAME_BUTTON,
  421.                             End,
  422.                             RGrp_AttrStart+RGrpA_Weight,RGrpV_Weight_Average,
  423.                             Child,    Group,
  424.                                 RGrp_AttrStart+RGrpA_Frame,RGrpV_Frame_Default,
  425.                                 IA_FrameType,FRAME_RIDGE,
  426.                                 Child,    StrI(ID_GAD_NUM,100),
  427.                             End,
  428.                         End,
  429.                         RGrp_AttrStart+RGrpA_Weight,RGrpV_Weight_Average,
  430.                         Child,    Group,
  431.                             RGrp_AttrStart+RGrpA_Rows, 4,
  432.                             Child,    RBut(ID_GAD_NO_0,"0"),
  433.                             Child,    RBut(ID_GAD_NO_1,"1"),
  434.                             Child,    RBut(ID_GAD_NO_2,"2"),
  435.                             Child,    RBut(ID_GAD_NO_3,"3"),
  436.                             Child,    RBut(ID_GAD_NO_4,"4"),
  437.                             Child,    RBut(ID_GAD_NO_5,"5"),
  438.                             Child,    RBut(ID_GAD_NO_6,"6"),
  439.                             Child,    RBut(ID_GAD_NO_7,"7"),
  440.                             Child,    RBut(ID_GAD_NO_8,"8"),
  441.                             Child,    RBut(ID_GAD_NO_9,"9"),
  442.                             Child,    RBut(ID_GAD_NO_A,"A"),
  443.                             Child,    RBut(ID_GAD_NO_B,"B"),
  444.                             Child,    RBut(ID_GAD_NO_C,"C"),
  445.                             Child,    RBut(ID_GAD_NO_D,"D"),
  446.                             Child,    RBut(ID_GAD_NO_E,"E"),
  447.                             Child,    RBut(ID_GAD_NO_F,"F"),
  448.                         End,
  449.                     End,
  450.                     Child,    GroupV,
  451.                         RGrp_AttrStart+RGrpA_Weight,200,
  452.                         Child, GroupU(2,2),
  453.                             Child,    RButD(ID_GAD_GET    ,"Get",TRUE),
  454.                             Child,    RButD(ID_GAD_LIST    ,"List",TRUE),
  455.                             Child,    RButD(ID_GAD_LAST    ,"Last",TRUE),
  456.                             Child,    RBut(ID_GAD_RESET    ,"Reset"),
  457.                         End,
  458.                         RGrp_AttrStart+RGrpA_Weight,100,
  459.                         Child,    RButT2(ID_GAD_GURUDOS    ,"Guru (hex)","DOS Error (dec)",FALSE),
  460.                     End,
  461.                 End,
  462.             End)
  463.         {
  464. /*            D(bug("Adding IC to the model"));
  465.             if (IC((struct Object *)prop,propmodmap,propmodel))*/ ret=TRUE;/*
  466.             else ShowErr("Couldn't create Interconnections.");*/
  467.         }
  468.         else ShowErr("Couldn't create gadgets.");
  469.     }
  470.     else ShowErr("Couldn't open public gadget-class.");
  471.     if (!ret) FreeGads();
  472.     return(ret);
  473. }
  474.  
  475. void CloseWin(BOOL kill)
  476. {
  477.     struct Process *proc = (struct Process *)FindTask(NULL);
  478.     if (win==oldprocwinptr) proc->pr_WindowPtr=oldprocwinptr;
  479.     if (win)
  480.     {
  481.         OldLeft        =win->LeftEdge;
  482.         OldTop        =win->TopEdge;
  483.         OldWidth    =win->Width;
  484.         OldHeight    =win->Height;
  485.         ClearMenuStrip(win);
  486.         CloseWindow(win);
  487.         win=NULL;
  488.     }
  489.     if (kill)
  490.     {
  491.         FreeGads();
  492.         if (menu)
  493.         {
  494.             FreeMenus(menu);
  495.             menu=NULL;
  496.         }
  497.     }
  498.     if (vi)
  499.     {
  500.         FreeVisualInfo(vi);
  501.         vi=NULL;
  502.     }
  503.     if (dri)
  504.     {
  505.         FreeScreenDrawInfo(scr,dri);
  506.         dri=NULL;
  507.     }
  508.     if (scr)
  509.     {
  510.         UnlockPubScreen(NULL, scr);
  511.         scr=NULL;
  512.     }
  513. }
  514.  
  515. BOOL OpenWin(STRPTR PubScreenName)
  516. {
  517.     BOOL ret=FALSE;
  518.     struct Process *proc;
  519.     struct gpDomain dom;
  520.  
  521.     if (!win)
  522.     {
  523.         if (scr=LockPubScreen(PubScreenName))
  524.         {
  525.             if (vi=GetVisualInfo(scr,TAG_DONE))
  526.             {
  527.                 if (dri = GetScreenDrawInfo(scr))
  528.                 {
  529.                     /* Build and layout menus using the right font */
  530.                     if (!menu) menu=CreateMenus(MainMenu,TAG_DONE);
  531.                     if (menu)
  532.                     {
  533.                         if (LayoutMenus(menu, vi,
  534.                             GTMN_NewLookMenus, TRUE,
  535.                             TAG_DONE))
  536.                         {
  537.                             if (MakeGads())
  538.                             {
  539.                                 dom.MethodID=GM_DOMAIN;
  540.                                 dom.gpd_GInfo=NULL;
  541.                                 dom.gpd_RPort=&scr->RastPort;
  542.                                 dom.gpd_Which=GDOMAIN_MINIMUM;
  543.                                 dom.gpd_Domain.Left=dom.gpd_Domain.Top=dom.gpd_Domain.Width=dom.gpd_Domain.Height=0;
  544.                                 dom.gpd_Attrs=NULL;
  545.                                 DoMethodA((Object *)gad,(Msg)&dom);
  546.                                 /*D(bug("Left=%ld,Top=%ld,Width=%ld,Height=%ld",dom.gpd_Domain.Left,dom.gpd_Domain.Top,dom.gpd_Domain.Width,dom.gpd_Domain.Height));*/
  547.                                 if (win = OpenWindowTags(NULL,
  548.                                     WA_Left,        (OldLeft  ?OldLeft  :100),
  549.                                     WA_Top,            (OldTop   ?OldTop   :50),
  550.                                     WA_Width,        (OldWidth ?OldWidth :(scr->WBorLeft+dom.gpd_Domain.Width+scr->WBorRight)),
  551.                                     WA_Height,        (OldHeight?OldHeight:(scr->WBorTop+scr->Font->ta_YSize+1+dom.gpd_Domain.Height+scr->WBorBottom)),
  552.                                     WA_MinWidth,        (scr->WBorLeft+dom.gpd_Domain.Width+scr->WBorRight),
  553.                                     WA_MinHeight,        (scr->WBorTop+scr->Font->ta_YSize+1+dom.gpd_Domain.Height+scr->WBorBottom),
  554.                                     WA_MaxWidth,        ~0,
  555.                                     WA_MaxHeight,        ~0,
  556.                                     WA_Title,        WinTitle,
  557.                                     WA_ScreenTitle,        ScrTitle,
  558.                                     WA_PubScreen,        scr,
  559.                                     WA_PubScreenFallBack,    FALSE,
  560.                                     WA_Zoom,        ZoomData,
  561.                                     WA_Gadgets,        gad,
  562.                                     WA_SizeGadget,        TRUE,
  563.                                     WA_DragBar,        TRUE,
  564.                                     WA_DepthGadget,        TRUE,
  565.                                     WA_CloseGadget,        TRUE,
  566.                                     WA_Activate,        TRUE,
  567.                                     WA_SimpleRefresh,    TRUE,
  568.                                     WA_SizeBBottom,        TRUE,
  569.                                     WA_MenuHelp,        TRUE,
  570.                                     WA_IDCMP,        IDCMP_CLOSEWINDOW|IDCMP_MENUPICK|IDCMP_MENUHELP|IDCMP_GADGETHELP|IDCMP_GADGETUP|IDCMP_GADGETDOWN|IDCMP_IDCMPUPDATE,
  571.                                     WA_NewLookMenus,    TRUE,
  572.                                     WA_PointerDelay,    TRUE,
  573.                                     TAG_DONE,NULL))
  574.                                 {
  575.                                     /*RefreshWindowFrame(win);*/
  576.                                     SetMenuStrip(win, menu);
  577.                                     proc = (struct Process *)FindTask(NULL);
  578.                                     oldprocwinptr=proc->pr_WindowPtr;
  579.                                     proc->pr_WindowPtr=win;
  580.                                     ret=TRUE;
  581.                                 }
  582.                                 else ShowErr("Couldn't open window.");
  583.                             }
  584.                         }
  585.                         else ShowErr("Couldn't layout menus.");
  586.                     }
  587.                     else ShowErr("Couldn't create menus.");
  588.                 }
  589.                 else ShowErr("Couldn't get ScreenDrawInfo.");
  590.             }
  591.             else ShowErr("Couldn't get VisualInfo for screen \"%s\".",PubScreenName);
  592.         }
  593.         else ShowErr("Couldn't find public screen \"%s\".\nEither the screen is in private state\nor the name is misspelled.",PubScreenName);
  594.         if (!ret) CloseWin(TRUE);
  595.     }
  596.     return(ret);
  597. }
  598.  
  599. /**************************************************************************************************
  600. ** Create/Remove Commodity & Handling of CX Messages
  601. **************************************************************************************************/
  602. BOOL CreateCX(void)
  603. {
  604.     BOOL ret=FALSE;
  605.     LONG err=CBERR_SYSERR;
  606.     if ((CxBase=OpenLibrary("commodities.library",36L))&&(BrokerMP=CreatePort(0,0)))
  607.     {
  608.         newbroker.nb_Port    = BrokerMP;
  609.         cxsigflag        = 1L<<BrokerMP->mp_SigBit;
  610.         newbroker.nb_Pri    = 0;
  611.         if (Broker=CxBroker(&newbroker,&err))
  612.         {
  613.             ActivateCxObj(Broker,TRUE);
  614.             ret=TRUE;
  615.         }
  616.     }
  617.     if ((err!=CBERR_OK)&&(err!=CBERR_DUP)) ShowErr("Couldn't create commodities broker, CxErr=%ld",err);
  618.     return(ret);
  619. }
  620.  
  621. void DisposeCX(void)
  622. {
  623.     struct Message *msg;
  624.     if (Broker) DeleteCxObjAll(Broker);
  625.     if (BrokerMP)
  626.     {
  627.         while (msg=GetMsg(BrokerMP)) ReplyMsg(msg);
  628.         DeletePort(BrokerMP);
  629.     }
  630.     CloseLib(CxBase);
  631. }
  632.  
  633. BOOL ProcessCxMsg(CxMsg *msg)
  634. {
  635.     ULONG    msgid=CxMsgID(msg),msgtype=CxMsgType(msg);
  636.     BOOL    quit=FALSE;
  637.  
  638.     switch (msgtype)
  639.     {
  640.         /*case CXM_IEVENT: break;*/
  641.         case CXM_COMMAND:    switch(msgid)
  642.                     {
  643.                         case CXCMD_DISABLE:    ActivateCxObj(Broker,FALSE);    break;
  644.                         case CXCMD_ENABLE:    ActivateCxObj(Broker,TRUE);    break;
  645.                         case CXCMD_DISAPPEAR:    CloseWin(FALSE);        break;
  646.                         case CXCMD_UNIQUE:    /* Fall Through */
  647.                         case CXCMD_APPEAR:    if (!win) OpenWin((strlen(PubScreenName)?(STRPTR)&PubScreenName:NULL));
  648.                                     else
  649.                                     {
  650.                                         ActivateWindow(win);
  651.                                         WindowToFront(win);
  652.                                     }                break;
  653.                         case CXCMD_KILL:    quit=TRUE;            break;
  654.                     }
  655.     }
  656.     ReplyMsg((struct Message *)msg);
  657.     return(quit);
  658. }
  659.  
  660. /**************************************************************************************************
  661. ** Handle Menus
  662. **************************************************************************************************/
  663. BOOL HandleMenuEvent(UWORD code)
  664. {
  665.     BOOL ret=FALSE;
  666.     struct MenuItem *item;
  667.     /*D(bug("Handling Menu event."));*/
  668.     while ((!ret)&&(code!=MENUNULL)&&(item = ItemAddress(menu,code)))
  669.     {
  670.         /*D(bug("Code : %ld, Item $%lx, ItemID %ld",code,item,(ULONG)GTMENUITEM_USERDATA(item)));*/
  671.         switch ((ULONG)GTMENUITEM_USERDATA(item))
  672.         {
  673.             case ID_PRJ_ABOUT:    {
  674.                             struct TagItem Tags[] = {RTEZ_ReqTitle,(ULONG)"About...",RT_LockWindow,TRUE,TAG_DONE,NULL};
  675.                             rtEZRequest((char *)AboutTxT,"Ok",NULL,(struct TagItem *)&Tags,RGrpGadBase->lib_Version,RGrpGadBase->lib_Revision,RButGadBase->lib_Version,RButGadBase->lib_Revision,VirtGadBase->lib_Version,VirtGadBase->lib_Revision,ValModelBase->lib_Version,ValModelBase->lib_Revision,ReqToolsBase->lib_Version,ReqToolsBase->lib_Revision);
  676.                         }
  677.                         break;
  678.             case ID_PRJ_HIDE:    CloseWin(FALSE);
  679.                         ret=TRUE;
  680.                         break;
  681.             case ID_PRJ_QUIT:    ret=TRUE;
  682.                         break;
  683.         }
  684.         code=item->NextSelect;
  685.     }
  686.     if ((ret)&&(win==NULL)) ret=FALSE;
  687.     return(ret);
  688. }
  689.  
  690. void ShowHelp(STRPTR TxT)
  691. {
  692.     rtEZRequestTags(TxT,"Ok",NULL,NULL,RTEZ_ReqTitle,NAME " Help...",RT_LockWindow,TRUE,TAG_DONE);
  693. }
  694.  
  695. /*
  696. ** Handle Help-button presses when selecting an menu-item.
  697. */
  698. void HandleMenuHelp(UWORD code)
  699. {
  700.     struct MenuItem *item;
  701.     /*D(bug("Handling MenuHelp"));*/
  702.     if (item = ItemAddress(menu,code))
  703.     {
  704.         switch ((ULONG)GTMENUITEM_USERDATA(item))
  705.         {
  706.             case ID_PRJ_ABOUT:    ShowHelp("Shows about/information of "NAME); break;
  707.             case ID_PRJ_HIDE:    ShowHelp("Hides "NAME); break;
  708.             case ID_PRJ_QUIT:    ShowHelp("Quits "NAME); break;
  709.             default:        ShowHelp("No help available for this item."); break;
  710.         }
  711.     }
  712. }
  713.  
  714. /**************************************************************************************************
  715. ** Main Program
  716. **************************************************************************************************/
  717. int main(int argc,char *argv[])
  718. {
  719.     struct IntuiMessage    *imsg;
  720.     ULONG            imsgClass,signal=0;
  721.     UWORD            imsgCode;
  722.     struct Gadget        *imsgGAddr;
  723.     int            ret=20;
  724.     BOOL            quit=FALSE;
  725.  
  726.     if (OpenLibs())
  727.     {
  728.         if (DoReadArgs())
  729.         {
  730.             if (CreateCX())
  731.             {
  732.                 if (OpenWin((strlen(PubScreenName)?(STRPTR)&PubScreenName:NULL)))
  733.                 {
  734.                     ret=0;
  735.                     while (!quit)
  736.                     {
  737.                         if (win) signal=Wait((1<<win->UserPort->mp_SigBit)|cxsigflag);
  738.                         else signal=Wait(cxsigflag);
  739.                         if (signal&cxsigflag)
  740.                         {
  741.                             CxMsg *cxmsg;
  742.                             while ((!quit)&&(cxmsg=(CxMsg *)GetMsg(BrokerMP))) quit=ProcessCxMsg(cxmsg);
  743.                         }
  744.                         if ((win)&&(signal&(1<<win->UserPort->mp_SigBit)))
  745.                         {
  746.                             while ((!quit)&&(win)&&(imsg = (struct IntuiMessage *)GetMsg(win->UserPort)))
  747.                             {
  748.                                 imsgClass = imsg->Class;
  749.                                 imsgCode  = imsg->Code;
  750.                                 imsgGAddr = (struct Gadget *)imsg->IAddress;
  751.                                 ReplyMsg((struct Message *)imsg);
  752.                                 D(bug("Msg : imsgClass=>%ld<",imsgClass));
  753.                                 switch (imsgClass)
  754.                                 {
  755.                                     case IDCMP_MENUHELP:    HandleMenuHelp(imsgCode); break;
  756.                                     case IDCMP_MENUPICK:    quit = HandleMenuEvent(imsgCode); break;
  757.                                     case IDCMP_CLOSEWINDOW:    quit=TRUE;
  758.                                                 break;
  759.                                     /*case IDCMP_GADGETUP:    if (imsgGAddr)
  760.                                                 {
  761.                                                     switch (imsgGAddr->GadgetID)
  762.                                                     {
  763.                                                         case 0: /* */ break;
  764.                                                     }
  765.                                                 }
  766.                                                 break;*/
  767.                                     case IDCMP_GADGETUP:    D(bug("GADGETUP")); break;
  768.                                     case IDCMP_GADGETDOWN:    D(bug("GADGETDOWN")); break;
  769.                                     case IDCMP_IDCMPUPDATE:    D(bug("IDCMPUPDATE")); break;
  770.                                     case IDCMP_GADGETHELP:    D(bug("GADGETHELP")); break;
  771.                                     default:        D(bug("???IDCMP???")); break;
  772.                                 }
  773.                             }
  774.                         }
  775.                     }
  776.                 }
  777.                 CloseWin(TRUE);
  778.             }
  779.             DisposeCX();
  780.         }
  781.     }
  782.     else ShowErr("Couldn't open a required resource (library/device).");
  783.     CloseLibs();
  784.     return(ret);
  785. }
  786.