home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 6 / AACD06.ISO / AACD / Utilities / amiCheck / Source / qdatePanel.c < prev    next >
C/C++ Source or Header  |  1998-06-11  |  12KB  |  503 lines

  1. /* qdatePanel.c 
  2.  *
  3.  *  defines the GUIFront characteristics of the qdate panel
  4.  */
  5. #include <exec/types.h>
  6. #include <exec/lists.h>
  7. #include <exec/nodes.h>
  8. #include <exec/memory.h>
  9. #include <stdio.h>
  10. #include <stdlib.h>
  11. #include <intuition/gadgetclass.h>
  12. #include <clib/alib_protos.h>
  13. #include <clib/exec_protos.h>
  14. #include <clib/intuition_protos.h>
  15. #include "amiCheck.h"
  16. #include "qdatePanel.h"
  17. #include "dataBase.h"
  18. #include "enterPanel.h"
  19. #include "regGadget.h"
  20.  
  21. /* prototypes */
  22. BOOL QDateHandleGadget(struct IntuiMessage *);
  23. BOOL QDateHandleSlide(struct IntuiMessage *);
  24. void QDateInit(char *);
  25. void QDateUpdateEasy(BOOL);
  26. dateNode *QDateSlot(UWORD, UBYTE, UBYTE);
  27.  
  28. ULONG qdateSel = ~0;
  29. struct Window *qdateWin = NULL;
  30. GUIFront *qdateGUI;
  31. static BOOL done;
  32. static BOOL useme;
  33. BOOL easydate;
  34. dateType edate;
  35.  
  36. /* quick configure of some gadgets */
  37. static const struct TagItem sdaytags[] =
  38. {
  39.     {GTSL_Min, 1},
  40.     {GTSL_Max, 31},
  41.     {GA_Immediate, TRUE},
  42.     {TAG_DONE},
  43. };
  44.  
  45. static const struct TagItem smonthtags[] =
  46. {
  47.     {GTSL_Min, 1},
  48.     {GTSL_Max, 12},
  49.     {GA_Immediate, TRUE},
  50.     {TAG_DONE},
  51. };
  52.  
  53. static const struct TagItem syeartags[] =
  54. {
  55.     {GTSL_Min, 1970},
  56.     {GTSL_Max, 2070},
  57.     {GA_Immediate, TRUE},
  58.     {TAG_DONE},
  59. };
  60.  
  61.  
  62. /* define gadgetspec */
  63. GadgetSpec QDgadgetspecs[] = 
  64. {
  65.     {LISTVIEW_KIND,DATESIZE+2,0, {0,0,0,0,NULL,NULL,GID_QDATELIST,
  66.         PLACETEXT_ABOVE},ListView,GS_DefaultTags},
  67.  
  68.          {SLIDER_KIND, 12,0, {0,0,0,0,NULL,NULL,GID_QDATEDAYSLIDE,
  69.         PLACETEXT_LEFT},sdaytags,GS_DefaultTags},
  70.     
  71.     {SLIDER_KIND, 12,0, {0,0,0,0,NULL,NULL,GID_QDATEMONTHSLIDE,
  72.         PLACETEXT_LEFT},smonthtags,GS_DefaultTags}, 
  73.  
  74.     {SLIDER_KIND, 12,0, {0,0,0,0,NULL,NULL,GID_QDATEYEARSLIDE,
  75.         PLACETEXT_LEFT},syeartags,GS_DefaultTags},
  76.  
  77.     {NUMBER_KIND, 4,0, {0,0,0,0,"Day",NULL,GID_QDATEDAY,
  78.         PLACETEXT_LEFT},NumBorder,GS_DefaultTags},
  79.  
  80.     {TEXT_KIND, 4,0, {0,0,0,0,"Month",NULL,GID_QDATEMONTH,
  81.         PLACETEXT_LEFT},TxtBorder,GS_DefaultTags},
  82.  
  83.     {NUMBER_KIND, 4,0, {0,0,0,0,"Year",NULL,GID_QDATEYEAR,
  84.         PLACETEXT_LEFT},NumBorder,GS_DefaultTags},
  85.  
  86.     {BUTTON_KIND, 6,0, {0,0,0,0,"_OK",NULL,GID_QDATEOK,
  87.         PLACETEXT_IN},NULL,GS_DefaultTags},
  88.  
  89. };
  90.  
  91. /* set up array of pointers to our specs */
  92. GadgetSpec *QD_DateSpecs[] =
  93. {
  94.         &QDgadgetspecs[0],
  95.         &QDgadgetspecs[1],
  96.         &QDgadgetspecs[2],
  97.         &QDgadgetspecs[3],
  98.         &QDgadgetspecs[4],
  99.         &QDgadgetspecs[5],
  100.         &QDgadgetspecs[6],
  101.         &QDgadgetspecs[7],
  102.         NULL,
  103. };
  104.  
  105.  
  106. /* define the layout of this panel */
  107. ULONG QD_DatePanel[] =
  108. {
  109.    GUIL_Flags, GUILF_PropShare | GUILF_EqualWidth,
  110.         
  111.   GUIL_HorizGroup,1,
  112.     GUIL_Flags, GUILF_EqualHeight,
  113.     GUIL_FrameType, GUILFT_Recess,
  114.  
  115.     GUIL_VertGroup,1,
  116.         GUIL_FrameType, GUILFT_Ridge,
  117. /*        GUIL_FrameHeadline, "Easy Date",*/
  118.  
  119.         GUIL_VertGroup,1,
  120.             GUIL_Flags, GUILF_LabelAlign | GUILF_EqualWidth,    
  121.  
  122.             GUIL_HorizGroup,0,
  123.                 GUIL_GadgetSpecID, GID_QDATEMONTH,
  124.                 GUIL_GadgetSpecID, GID_QDATEMONTHSLIDE,
  125.             TAG_DONE,
  126.  
  127.             GUIL_HorizGroup,0,
  128.                 GUIL_GadgetSpecID, GID_QDATEDAY,
  129.                 GUIL_GadgetSpecID, GID_QDATEDAYSLIDE,
  130.             TAG_DONE,
  131.  
  132.             GUIL_HorizGroup,0,
  133.                 GUIL_GadgetSpecID, GID_QDATEYEAR,
  134.                 GUIL_GadgetSpecID, GID_QDATEYEARSLIDE,
  135.             TAG_DONE,
  136.         TAG_DONE,
  137.  
  138.         /*GUIL_GadgetSpecID, GID_QDATELIST,*/
  139.     TAG_DONE,
  140.  
  141.     GUIL_VertGroup,1,
  142.             GUIL_FrameType, GUILFT_Ridge,
  143. /*        GUIL_FrameHeadline, "Quick Date", */                         
  144.  
  145.         GUIL_GadgetSpecID, GID_QDATELIST,
  146.         TAG_DONE,
  147.   TAG_DONE,
  148.    
  149.     GUIL_HorizGroup,1,
  150.         GUIL_Flags, GUILF_EqualSize | GUILF_EqualWidth,
  151.         
  152.            GUIL_GadgetSpecID, GID_QDATEOK,
  153.            
  154.     TAG_DONE,                     
  155. TAG_DONE,       
  156. };
  157.  
  158. /****************************************************
  159. * QDateGUI
  160. *
  161. *    create gui for this panel
  162. *****************************************************/
  163. BOOL QDateGUI(char *currdate)
  164. {
  165.  UWORD ordinal;
  166.  BOOL noreply; 
  167.  ULONG signal;
  168.  
  169.    useme = done = FALSE;
  170.  
  171.    /* lock edit window */
  172.    GF_LockGUI(entryGUI);
  173.  
  174.    /* bring up this gui */
  175.    GF_SetGUIAttr(qdateGUI, GUI_OpenGUI, TRUE, TAG_DONE);
  176.    
  177.    /* grab window */
  178.    GF_GetGUIAttr(qdateGUI,GUI_Window,&qdateWin,TAG_DONE);
  179.  
  180.    QDateInit(currdate);
  181.  
  182.    /* Process input events */
  183.     while (!done)
  184.        {
  185.          struct IntuiMessage *imsg;
  186.                     /* Wait for an event to occur */
  187.  
  188.                     signal = GF_Wait(guiapp,AmigaGuideSignal(agc));
  189.             if (signal & AmigaGuideSignal(agc)) {
  190.             AmiHelpMsg();
  191.             continue;
  192.             }
  193.  
  194.                     /* We only bother to listen for CLOSEWINDOW events.
  195.                      * Of course, in a real application, you would be
  196.                      * examining the Class field for IDCMP_GADGETUP
  197.                      * messages and act accordingly.
  198.                      */
  199.  
  200.                     while (imsg = GF_GetIMsg(guiapp))
  201.                     {
  202.             noreply = TRUE;
  203.                         switch (imsg->Class) {
  204.                 case IDCMP_REFRESHWINDOW:
  205.                     RegRefresh(TRUE);
  206.                     break;
  207.  
  208.                                 case IDCMP_CLOSEWINDOW:
  209.                                         done = TRUE;
  210.                                         break;
  211.  
  212.                 case IDCMP_RAWKEY:
  213.                     if (GF_ProcessListView(qdateGUI,QD_DateSpecs[GID_QDATELIST],
  214.                         imsg,&ordinal)) {
  215.                             qdateSel = ordinal;    
  216.                     }
  217.                     else AmiHelpKey(imsg,QUICKDATE_PANEL);
  218.                     break;
  219.  
  220.                 case IDCMP_GADGETUP:
  221.                     noreply = FALSE;
  222.                     done=QDateHandleGadget(imsg);
  223.                     break;
  224.  
  225.                 case IDCMP_GADGETDOWN:
  226.                     done = QDateHandleSlide(imsg);
  227.                     break;
  228.  
  229.                 case IDCMP_MOUSEMOVE:
  230.                     done=QDateHandleSlide(imsg);
  231.                     break;
  232.                 }
  233.  
  234.             if (noreply) GF_ReplyIMsg(imsg);
  235.  
  236.              }
  237.   }
  238.  
  239.   /* detach list */
  240.   GF_SetGadgetAttrs(qdateGUI,QDgadgetspecs[GID_QDATELIST].gs_Gadget,
  241.     GTLV_Labels, ~0,
  242.     TAG_DONE);
  243.  
  244.   /* close window */
  245.   GF_SetGUIAttr(qdateGUI, GUI_OpenGUI, FALSE, TAG_DONE);            
  246.   qdateWin = NULL;
  247.       
  248.   /* unlock edit window */
  249.   GF_UnlockGUI(entryGUI);
  250.  
  251.   return (useme);
  252. }
  253.  
  254. /***************************************************
  255. * QDateHandleSlide....
  256. *
  257. *     set slide
  258. ****************************************************/
  259. BOOL QDateHandleSlide(struct IntuiMessage *imsg)
  260. {
  261. BOOL done = FALSE;
  262. struct Gadget *gad = (struct Gadget *)(imsg->IAddress);
  263. UWORD code = imsg->Code;
  264.  
  265.  switch (gad->GadgetID) {
  266.     case GID_QDATEYEARSLIDE:
  267.         edate.year = code;
  268.         QDateUpdateEasy(FALSE);
  269.         break;
  270.  
  271.     case GID_QDATEMONTHSLIDE:
  272.         edate.month = code-1;
  273.         if (edate.day > daysinmonth[edate.month])
  274.             edate.day = daysinmonth[edate.month];
  275.  
  276.         QDateUpdateEasy(TRUE);
  277.         break;
  278.  
  279.     case GID_QDATEDAYSLIDE:
  280.         edate.day = code;
  281.         QDateUpdateEasy(FALSE);
  282.         break;
  283.  }
  284.  
  285.  return (done);
  286. }
  287.  
  288. /***************************************************
  289. * QDateHandleGadget....
  290. *
  291. *     double clicks change ord val.
  292. ****************************************************/
  293. BOOL QDateHandleGadget(struct IntuiMessage *imsg)
  294. {
  295. BOOL done = FALSE;
  296. struct Gadget *gad = (struct Gadget *)(imsg->IAddress);
  297. UWORD code = imsg->Code;
  298. dateNode *date;
  299.  
  300.  switch (gad->GadgetID) {
  301.  
  302.     case GID_QDATEOK:
  303.         easydate = TRUE;
  304.         useme = TRUE;
  305.         done=TRUE;
  306.         edate.month++;
  307.         break;
  308.  
  309.     case GID_QDATELIST:
  310.         easydate = FALSE;
  311.         qdateSel = code;
  312.  
  313.         date = (dateNode *)DataOrd2Node((struct List *)&datelist,qdateSel);
  314.         memcpy(&edate,&date->date,sizeof(dateType));
  315.         edate.month--;
  316.  
  317.         if (edate.year < 1970) edate.year = 1970;
  318.         if (edate.year > 2070) edate.year = 2070;
  319.  
  320.         QDateUpdateEasy(TRUE);
  321.  
  322.         /* now set sliders */
  323.          GF_SetGadgetAttrs(qdateGUI,QDgadgetspecs[GID_QDATEDAYSLIDE].gs_Gadget,
  324.             GTSL_Level,edate.day,
  325.             TAG_DONE);
  326.  
  327.          GF_SetGadgetAttrs(qdateGUI,QDgadgetspecs[GID_QDATEMONTHSLIDE].gs_Gadget,
  328.             GTSL_Level,edate.month+1,
  329.             TAG_DONE);
  330.  
  331.          GF_SetGadgetAttrs(qdateGUI,QDgadgetspecs[GID_QDATEYEARSLIDE].gs_Gadget,
  332.             GTSL_Level,edate.year,
  333.             TAG_DONE);
  334.  
  335.         break;
  336.  }
  337.  
  338.  return (done);
  339. }
  340.  
  341. /***********************************************************
  342. * QDateUpdateEasy()
  343. *
  344. *    Update the easy-date settings
  345. ************************************************************/
  346. void QDateUpdateEasy(BOOL adjust)
  347. {
  348.  
  349.     GF_SetGadgetAttrs(qdateGUI,QDgadgetspecs[GID_QDATEDAY].gs_Gadget,
  350.             GTNM_Number,edate.day,
  351.             TAG_DONE);
  352.  
  353.     GF_SetGadgetAttrs(qdateGUI,QDgadgetspecs[GID_QDATEMONTH].gs_Gadget,
  354.             GTTX_Text,easymonths[edate.month],
  355.             TAG_DONE);
  356.  
  357.     GF_SetGadgetAttrs(qdateGUI,QDgadgetspecs[GID_QDATEYEAR].gs_Gadget,
  358.             GTNM_Number,edate.year,
  359.             TAG_DONE);
  360.  
  361.     /*adjust days for month? */
  362.     if (adjust == TRUE) {
  363.         GF_SetGadgetAttrs(qdateGUI,QDgadgetspecs[GID_QDATEDAYSLIDE].gs_Gadget,
  364.             GTSL_Max, daysinmonth[edate.month],
  365.             TAG_DONE);
  366.     }
  367. }
  368.  
  369. /***********************************************************
  370. * QDateInit()
  371. *
  372. *
  373. ************************************************************/
  374. void QDateInit(char *datestr)
  375. {
  376.  char newstr[DATESIZE+1];
  377.  dateNode *date;
  378.  
  379.  GF_SetGadgetAttrs(qdateGUI,QDgadgetspecs[GID_QDATELIST].gs_Gadget,
  380.     GTLV_Labels, &datelist,
  381.     GTLV_Selected, ~0,
  382.     /*GTLV_MakeVisible, qdateSel,*/
  383.     TAG_DONE);
  384.    
  385.  if (qdateSel != ~0)
  386.  GF_SetGadgetAttrs(qdateGUI,QDgadgetspecs[GID_QDATELIST].gs_Gadget,
  387.     GTLV_MakeVisible, qdateSel,
  388.     TAG_DONE);
  389.  
  390.  
  391.  /* now fill in easy-date gadgets */
  392.  if (DataVerifyDate(datestr,newstr)) {
  393.      DataStoreDate(&edate,newstr);
  394.  }
  395.  else     {
  396.     date = (dateNode *)DataOrd2Node((struct List *)&datelist,qdateSel);
  397.     memcpy(&edate,&date->date,sizeof(dateType));
  398.  
  399.     GF_SetGadgetAttrs(qdateGUI,QDgadgetspecs[GID_QDATELIST].gs_Gadget,
  400.         GTLV_Selected, qdateSel,
  401.         GTLV_MakeVisible, qdateSel,
  402.         TAG_DONE);
  403.  }
  404.  
  405.  edate.month--;
  406.  
  407.  if (edate.year < 1970) edate.year = 1970;
  408.  if (edate.year > 2070) edate.year = 2070;
  409.  
  410.  QDateUpdateEasy(TRUE); 
  411.  
  412.  /* now set sliders */
  413.  GF_SetGadgetAttrs(qdateGUI,QDgadgetspecs[GID_QDATEDAYSLIDE].gs_Gadget,
  414.     GTSL_Level,edate.day,
  415.     TAG_DONE);
  416.  
  417.  GF_SetGadgetAttrs(qdateGUI,QDgadgetspecs[GID_QDATEMONTHSLIDE].gs_Gadget,
  418.     GTSL_Level,edate.month+1,
  419.     TAG_DONE);
  420.  
  421.  GF_SetGadgetAttrs(qdateGUI,QDgadgetspecs[GID_QDATEYEARSLIDE].gs_Gadget,
  422.     GTSL_Level,edate.year,
  423.     TAG_DONE);
  424.  
  425. }
  426.  
  427. /***********************************************************
  428. * QDateAdd()
  429. *
  430. *    Adds a date to the date list
  431. ************************************************************/
  432. void QDateAdd(dateType *new)
  433. {
  434.  dateNode *node, *parent = NULL;
  435.  
  436.  /* find a parent for this new node */
  437.  if ( (parent = QDateSlot(new->year,new->month, new->day)) == NULL)
  438.     return;
  439.  
  440.  if ((node = AllocVec(sizeof(dateNode),MEMF_CLEAR))){
  441.     memcpy(&node->date,new,sizeof(dateType));
  442.  
  443.     /* build date string */
  444.     DataBuildDate(&node->date,node->dateStr);
  445.  
  446.     node->node.ln_Type = NT_USER;
  447.     node->node.ln_Pri = 0;
  448.     node->node.ln_Name = node->dateStr;
  449.  
  450.     Insert(&datelist,(struct Node *)node, (struct Node *)parent);
  451.     qdateSel = DataNode2Ord(&datelist,node->dateStr);
  452.  }
  453.  else return;
  454. }
  455.  
  456. /***********************************************************
  457. * QDateSlot()
  458. *
  459. *    Locate a parent node for the current date 
  460. ***********************************************************/
  461. dateNode *QDateSlot(USHORT year, UBYTE month, UBYTE day)
  462. {
  463.  dateNode *temp = (dateNode *)datelist.lh_Head, *next;
  464.  
  465.  /* is this the first date? */
  466.  if (IsListEmpty(&datelist)) {
  467.     return ((dateNode *)&datelist);
  468.  }
  469.  
  470.  /* loop through each node from old to new */
  471.  while (next = (dateNode *)(temp->node.ln_Succ)) {
  472.     /* redundant? */
  473.     if (year == temp->date.year && month == temp->date.month && day == temp->date.day)
  474.         return (NULL);
  475.  
  476.        /* am I older than the current node? */
  477.     if (year < temp->date.year ||
  478.        (year == temp->date.year && month < temp->date.month) ||
  479.        (year == temp->date.year && month == temp->date.month && day < temp->date.day)) {
  480.         return ((dateNode *)temp->node.ln_Pred);
  481.     }
  482.  
  483.     temp = next;
  484.  }
  485.  
  486.  /* stuff at end! */
  487.  return (temp);
  488. }
  489.  
  490. /*********************************************************
  491. * QDateNewFormat()
  492. *
  493. *    Updates the list to the new date format
  494. **********************************************************/
  495. void QDateNewFormat(void)
  496. {
  497.  dateNode *work = NULL;
  498.  
  499.  while ( (work = (dateNode *)DataGetNext(&datelist,work)) != NULL) {
  500.     DataBuildDate(&work->date,work->dateStr);
  501.  }
  502. }
  503.