home *** CD-ROM | disk | FTP | other *** search
/ Amiga Elysian Archive / AmigaElysianArchive.iso / comm / term33so.lha / DatePanel.c < prev    next >
C/C++ Source or Header  |  1993-04-30  |  7KB  |  285 lines

  1. /*
  2. **    DatePanel.c
  3. **
  4. **    Editing panel for date selection
  5. **
  6. **    Copyright © 1990-1993 by Olaf `Olsen' Barthel & MXM
  7. **        All Rights Reserved
  8. */
  9.  
  10. #include "termGlobal.h"
  11.  
  12. enum    {    GAD_MONTH,GAD_DAY,GAD_COMMENT,GAD_USE,GAD_CANCEL };
  13.  
  14. STATIC UBYTE * __saveds
  15. ShowMonth(struct Gadget *SomeGadget,WORD Level)
  16. {
  17.     STATIC UBYTE Month[20];
  18.  
  19.     SPrintf(Month,"%9s",LocaleString(Level + MSG_DATEPANEL_JANUARY_TXT));
  20.  
  21.     return(Month);
  22. }
  23.  
  24. STATIC struct Gadget *
  25. CreateAllGadgets(struct TimeDateNode *Node,struct Gadget **GadgetArray,struct Gadget **GadgetList)
  26. {
  27.     struct Gadget        *Gadget;
  28.     struct NewGadget     NewGadget;
  29.     UWORD             Counter = 0;
  30.  
  31.     SZ_SizeSetup(Window -> WScreen,&UserFont,TRUE);
  32.  
  33.     memset(&NewGadget,0,sizeof(struct NewGadget));
  34.  
  35.     if(Gadget = CreateContext(GadgetList))
  36.     {
  37.         SZ_AddLeftOffset(SZ_LeftOffsetN(MSG_DATEPANEL_MONTH_GAD,MSG_DATEPANEL_DAY_GAD,MSG_GLOBAL_COMMENT_GAD,-1));
  38.  
  39.         SZ_SetWidth(SZ_Width(STRING_KIND,NULL,20,NULL));
  40.  
  41.         NewGadget . ng_GadgetText    = LocaleString(MSG_DATEPANEL_MONTH_GAD);
  42.         NewGadget . ng_GadgetID        = Counter;
  43.         NewGadget . ng_Flags        = PLACETEXT_LEFT|NG_HIGHLABEL;
  44.  
  45.         GadgetArray[Counter++] = Gadget = CreateGadget(SLIDER_KIND,Gadget,&NewGadget,
  46.             SZ_Adjust,        TRUE,
  47.             SZ_AutoWidth,        TRUE,
  48.  
  49.             GTSL_Level,        Node -> Header . Month,
  50.             GTSL_Max,        11,
  51.             GTSL_MaxLevelLen,    9,
  52.             GTSL_LevelFormat,    "%s",
  53.             GTSL_DispFunc,        ShowMonth,
  54.             PGA_Freedom,        LORIENT_HORIZ,
  55.             GA_Immediate,        TRUE,
  56.             GA_RelVerify,        TRUE,
  57.         TAG_DONE);
  58.  
  59.         NewGadget . ng_GadgetText    = LocaleString(MSG_DATEPANEL_DAY_GAD);
  60.         NewGadget . ng_GadgetID        = Counter;
  61.  
  62.         GadgetArray[Counter++] = Gadget = CreateGadget(SLIDER_KIND,Gadget,&NewGadget,
  63.             SZ_Adjust,        TRUE,
  64.             SZ_AutoWidth,        TRUE,
  65.  
  66.             GTSL_Level,        Node -> Header . Day,
  67.             GTSL_Min,        1,
  68.             GTSL_Max,        31,
  69.             GTSL_MaxLevelLen,    2,
  70.             GTSL_LevelFormat,    "%2ld",
  71.             PGA_Freedom,        LORIENT_HORIZ,
  72.             GA_Immediate,        TRUE,
  73.             GA_RelVerify,        TRUE,
  74.         TAG_DONE);
  75.  
  76.         NewGadget . ng_GadgetText    = LocaleString(MSG_GLOBAL_COMMENT_GAD);
  77.         NewGadget . ng_GadgetID        = Counter;
  78.  
  79.         GadgetArray[Counter++] = Gadget = CreateGadget(STRING_KIND,Gadget,&NewGadget,
  80.             SZ_Adjust,    TRUE,
  81.             SZ_AutoWidth,    TRUE,
  82.  
  83.             GTST_MaxChars,    19,
  84.             GTST_String,    Node -> Header . Comment,
  85.             GA_Immediate,    TRUE,
  86.         TAG_DONE);
  87.  
  88.         SZ_UpdateMaxWidth(BUTTON_KIND,LocaleString(MSG_GLOBAL_USE_GAD),0,NULL);
  89.         SZ_UpdateMaxWidth(BUTTON_KIND,LocaleString(MSG_GLOBAL_CANCEL_GAD),0,NULL);
  90.  
  91.         SZ_SetWidth(SZ_ResetMaxWidth());
  92.  
  93.         NewGadget . ng_GadgetText    = LocaleString(MSG_GLOBAL_USE_GAD);
  94.         NewGadget . ng_GadgetID        = Counter;
  95.         NewGadget . ng_Flags        = 0;
  96.  
  97.         GadgetArray[Counter++] = Gadget = CreateGadget(BUTTON_KIND,Gadget,&NewGadget,
  98.             SZ_Adjust,    TRUE,
  99.             SZ_AutoWidth,    TRUE,
  100.             SZ_AlignExtra,    TRUE,
  101.             SZ_AlignLeft,    TRUE,
  102.             SZ_AlignBottom,    TRUE,
  103.         TAG_DONE);
  104.  
  105.         NewGadget . ng_GadgetText    = LocaleString(MSG_GLOBAL_CANCEL_GAD);
  106.         NewGadget . ng_GadgetID        = Counter;
  107.  
  108.         GadgetArray[Counter] = Gadget = CreateGadget(BUTTON_KIND,Gadget,&NewGadget,
  109.             SZ_Adjust,    TRUE,
  110.             SZ_AutoWidth,    TRUE,
  111.             SZ_AlignRight,    TRUE,
  112.         TAG_DONE);
  113.     }
  114.  
  115.     return(Gadget);
  116. }
  117.  
  118. BYTE
  119. DatePanel(struct TimeDateNode *Node)
  120. {
  121.     STATIC BYTE MaxDays[12] = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
  122.  
  123.     struct Window        *PanelWindow;
  124.     struct Gadget        *GadgetList;
  125.     struct Gadget        *GadgetArray[GAD_CANCEL + 1];
  126.     BYTE             Result = FALSE;
  127.     struct TimeDateNode     LocalNode;
  128.  
  129.     LocalNode = *Node;
  130.  
  131.     if(CreateAllGadgets(Node,GadgetArray,&GadgetList))
  132.     {
  133.         if(PanelWindow = OpenWindowTags(NULL,
  134.             WA_Left,    GetScreenLeft(Window) + (GetScreenWidth(Window) - SZ_GetWindowWidth()) / 2,
  135.             WA_Top,        GetScreenTop(Window) + (GetScreenHeight(Window) - SZ_GetWindowHeight())    / 2,
  136.             WA_Width,    SZ_GetWindowWidth(),
  137.             WA_Height,    SZ_GetWindowHeight(),
  138.  
  139.             WA_Activate,    TRUE,
  140.             WA_DragBar,    TRUE,
  141.             WA_DepthGadget,    TRUE,
  142.             WA_RMBTrap,    TRUE,
  143.             WA_DepthGadget,    TRUE,
  144.             WA_CloseGadget,    TRUE,
  145.             WA_CustomScreen,Window -> WScreen,
  146.             WA_IDCMP,    IDCMP_ACTIVEWINDOW | IDCMP_CLOSEWINDOW | IDCMP_RAWKEY | IDCMP_VANILLAKEY | IDCMP_GADGETDOWN | BUTTONIDCMP | SLIDERIDCMP | STRINGIDCMP,
  147.             WA_Title,    LocaleString(MSG_DATEPANEL_DATE_SETTINGS_TXT),
  148.         TAG_DONE))
  149.         {
  150.             struct IntuiMessage    *Massage;
  151.             ULONG             IClass,Code;
  152.             struct Gadget        *Gadget;
  153.             BYTE             Terminated = FALSE;
  154.  
  155.             GuideContext(CONTEXT_DATE);
  156.  
  157.             PushWindow(PanelWindow);
  158.  
  159.             AddGList(PanelWindow,GadgetList,(UWORD)-1,(UWORD)-1,NULL);
  160.             RefreshGList(GadgetList,PanelWindow,NULL,(UWORD)-1);
  161.             GT_RefreshWindow(PanelWindow,NULL);
  162.  
  163.             ActiveGadget = NULL;
  164.  
  165.             ClrSignal(SIG_BREAK);
  166.  
  167.             while(!Terminated)
  168.             {
  169.                 if(Wait(PORTMASK(PanelWindow -> UserPort) | SIG_BREAK) & SIG_BREAK)
  170.                 {
  171.                     *Node = LocalNode;
  172.  
  173.                     break;
  174.                 }
  175.  
  176.                 while(!Terminated && (Massage = (struct IntuiMessage *)GT_GetIMsg(PanelWindow -> UserPort)))
  177.                 {
  178.                     IClass    = Massage -> Class;
  179.                     Code    = Massage -> Code;
  180.                     Gadget    = (struct Gadget *)Massage -> IAddress;
  181.  
  182.                     GT_ReplyIMsg(Massage);
  183.  
  184.                     KeySelect(GadgetArray,GAD_CANCEL,Code,PanelWindow,&Gadget,&IClass,&Code);
  185.  
  186.                     if(IClass == IDCMP_GADGETDOWN)
  187.                     {
  188.                         if((Gadget -> GadgetType & GTYP_GTYPEMASK) == GTYP_STRGADGET)
  189.                             ActiveGadget = Gadget;
  190.                     }
  191.  
  192.                     if(IClass == IDCMP_ACTIVEWINDOW && ActiveGadget)
  193.                         ActivateGadget(ActiveGadget,PanelWindow,NULL);
  194.  
  195.                     if(IClass == IDCMP_CLOSEWINDOW)
  196.                     {
  197.                         *Node = LocalNode;
  198.  
  199.                         Terminated = TRUE;
  200.                     }
  201.  
  202.                     if(IClass == IDCMP_MOUSEMOVE)
  203.                     {
  204.                         switch(Gadget -> GadgetID)
  205.                         {
  206.                             case GAD_MONTH:
  207.  
  208.                                 Node -> Header . Month = Code;
  209.                                 break;
  210.  
  211.                             case GAD_DAY:
  212.  
  213.                                 Node -> Header . Day = Code;
  214.                                 break;
  215.                         }
  216.                     }
  217.  
  218.                     if(IClass == IDCMP_GADGETUP)
  219.                     {
  220.                         switch(Gadget -> GadgetID)
  221.                         {
  222.                             case GAD_MONTH:
  223.  
  224.                                 Node -> Header . Month = Code;
  225.  
  226.                                 if(Node -> Header . Day > MaxDays[Node -> Header . Month])
  227.                                 {
  228.                                     GT_SetGadgetAttrs(GadgetArray[GAD_DAY],PanelWindow,NULL,
  229.                                         GTSL_Level,    Node -> Header . Day = MaxDays[Node -> Header . Month],
  230.                                     TAG_DONE);
  231.                                 }
  232.  
  233.                                 break;
  234.  
  235.                             case GAD_DAY:
  236.  
  237.                                 if(Code > MaxDays[Node -> Header . Month])
  238.                                 {
  239.                                     Code = MaxDays[Node -> Header . Month];
  240.  
  241.                                     GT_SetGadgetAttrs(GadgetArray[GAD_DAY],PanelWindow,NULL,
  242.                                         GTSL_Level,    Code,
  243.                                     TAG_DONE);
  244.                                 }
  245.  
  246.                                 Node -> Header . Day = Code;
  247.                                 break;
  248.  
  249.                             case GAD_USE:
  250.  
  251.                                 strcpy(Node -> Header . Comment,SZ_GetString(GadgetArray[GAD_COMMENT]));
  252.  
  253.                                 Terminated = TRUE;
  254.  
  255.                                 Result = TRUE;
  256.  
  257.                                 break;
  258.  
  259.                             case GAD_CANCEL:
  260.  
  261.                                 *Node = LocalNode;
  262.  
  263.                                 Terminated = TRUE;
  264.  
  265.                                 break;
  266.                         }
  267.                     }
  268.                 }
  269.             }
  270.  
  271.             RemoveGList(PanelWindow,GadgetList,(UWORD)-1);
  272.  
  273.             PopWindow();
  274.  
  275.             CloseWindow(PanelWindow);
  276.         }
  277.  
  278.         FreeGadgets(GadgetList);
  279.     }
  280.  
  281.     ActiveGadget = NULL;
  282.  
  283.     return(Result);
  284. }
  285.