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

  1. /*
  2. **    CursorPanel.c
  3. **
  4. **    Editing panel for cursor key configuration
  5. **
  6. **    Copyright © 1990-1993 by Olaf `Olsen' Barthel & MXM
  7. **        All Rights Reserved
  8. */
  9.  
  10. #include "termGlobal.h"
  11.  
  12. enum    {    GAD_UP,GAD_DOWN,GAD_RIGHT,GAD_LEFT,GAD_QUALIFIER,
  13.         GAD_USE,GAD_LOAD,GAD_SAVE,GAD_CANCEL };
  14.  
  15. STATIC STRPTR ModifierString[5];
  16.  
  17. STATIC struct Gadget *
  18. CreateAllGadgets(struct Gadget **GadgetArray,struct Gadget **GadgetList)
  19. {
  20.     struct Gadget        *Gadget;
  21.     struct NewGadget     NewGadget;
  22.     UWORD             Counter = 0;
  23.  
  24.     LocalizeString(ModifierString,MSG_MACROPANEL_NONE_TXT,MSG_MACROPANEL_CONTROL_TXT);
  25.  
  26.     SZ_SizeSetup(Window -> WScreen,&UserFont,TRUE);
  27.  
  28.     memset(&NewGadget,0,sizeof(struct NewGadget));
  29.  
  30.     if(Gadget = CreateContext(GadgetList))
  31.     {
  32.         SZ_AddLeftOffset(SZ_LeftOffsetDelta(MSG_CURSORPANEL_CURSOR_UP_GAD,MSG_CURSORPANEL_CURSOR_RIGHT_GAD));
  33.  
  34.         SZ_SetWidth(SZ_Width(STRING_KIND,NULL,40,NULL));
  35.  
  36.         NewGadget . ng_GadgetText    = LocaleString(MSG_CURSORPANEL_CURSOR_UP_GAD);
  37.         NewGadget . ng_GadgetID        = Counter;
  38.  
  39.         GadgetArray[Counter++] = Gadget = CreateGadget(STRING_KIND,Gadget,&NewGadget,
  40.             SZ_Adjust,    TRUE,
  41.             SZ_AutoWidth,    TRUE,
  42.  
  43.             GTST_MaxChars,    255,
  44.         TAG_DONE);
  45.  
  46.         NewGadget . ng_GadgetText    = LocaleString(MSG_CURSORPANEL_CURSOR_DOWN_GAD);
  47.         NewGadget . ng_GadgetID        = Counter;
  48.  
  49.         GadgetArray[Counter++] = Gadget = CreateGadget(STRING_KIND,Gadget,&NewGadget,
  50.             SZ_Adjust,    TRUE,
  51.             SZ_AutoWidth,    TRUE,
  52.  
  53.             GTST_MaxChars,    255,
  54.         TAG_DONE);
  55.  
  56.         NewGadget . ng_GadgetText    = LocaleString(MSG_CURSORPANEL_CURSOR_RIGHT_GAD);
  57.         NewGadget . ng_GadgetID        = Counter;
  58.  
  59.         GadgetArray[Counter++] = Gadget = CreateGadget(STRING_KIND,Gadget,&NewGadget,
  60.             SZ_Adjust,    TRUE,
  61.             SZ_AutoWidth,    TRUE,
  62.  
  63.             GTST_MaxChars,    255,
  64.         TAG_DONE);
  65.  
  66.         NewGadget . ng_GadgetText    = LocaleString(MSG_CURSORPANEL_CURSOR_LEFT_GAD);
  67.         NewGadget . ng_GadgetID        = Counter;
  68.  
  69.         GadgetArray[Counter++] = Gadget = CreateGadget(STRING_KIND,Gadget,&NewGadget,
  70.             SZ_Adjust,    TRUE,
  71.             SZ_AutoWidth,    TRUE,
  72.  
  73.             GTST_MaxChars,    255,
  74.         TAG_DONE);
  75.  
  76.         NewGadget . ng_GadgetText    = LocaleString(MSG_MACROPANEL_KEY_MODIFIER_GAD);
  77.         NewGadget . ng_GadgetID        = Counter;
  78.  
  79.         GadgetArray[Counter++] = Gadget = CreateGadget(CYCLE_KIND,Gadget,&NewGadget,
  80.             SZ_Adjust,    TRUE,
  81.             SZ_AlignCentre,    TRUE,
  82.  
  83.             GTCY_Labels,    ModifierString,
  84.             GTCY_Active,    0,
  85.         TAG_DONE);
  86.  
  87.         SZ_UpdateMaxWidth(BUTTON_KIND,LocaleString(MSG_GLOBAL_USE_GAD),0,NULL);
  88.         SZ_UpdateMaxWidth(BUTTON_KIND,LocaleString(MSG_GLOBAL_CANCEL_GAD),0,NULL);
  89.         SZ_UpdateMaxWidth(BUTTON_KIND,LocaleString(MSG_GLOBAL_LOAD_GAD),0,NULL);
  90.         SZ_UpdateMaxWidth(BUTTON_KIND,LocaleString(MSG_GLOBAL_CANCEL_GAD),0,NULL);
  91.  
  92.         SZ_SetWidth(SZ_ResetMaxWidth());
  93.  
  94.         NewGadget . ng_GadgetText    = LocaleString(MSG_GLOBAL_USE_GAD);
  95.         NewGadget . ng_GadgetID        = Counter;
  96.         NewGadget . ng_Flags        = 0;
  97.  
  98.         GadgetArray[Counter++] = Gadget = CreateGadget(BUTTON_KIND,Gadget,&NewGadget,
  99.             SZ_Adjust,    TRUE,
  100.             SZ_AutoWidth,    TRUE,
  101.             SZ_AlignExtra,    TRUE,
  102.             SZ_AlignBottom,    TRUE,
  103.             SZ_GroupCount,    4,
  104.         TAG_DONE);
  105.  
  106.         NewGadget . ng_GadgetText    = LocaleString(MSG_GLOBAL_LOAD_GAD);
  107.         NewGadget . ng_GadgetID        = Counter;
  108.  
  109.         GadgetArray[Counter++] = Gadget = CreateGadget(BUTTON_KIND,Gadget,&NewGadget,
  110.             SZ_Adjust,    TRUE,
  111.             SZ_AutoWidth,    TRUE,
  112.             SZ_GroupNext,    TRUE,
  113.         TAG_DONE);
  114.  
  115.         NewGadget . ng_GadgetText    = LocaleString(MSG_GLOBAL_SAVE_GAD);
  116.         NewGadget . ng_GadgetID        = Counter;
  117.  
  118.         GadgetArray[Counter++] = Gadget = CreateGadget(BUTTON_KIND,Gadget,&NewGadget,
  119.             SZ_Adjust,    TRUE,
  120.             SZ_AutoWidth,    TRUE,
  121.             SZ_GroupNext,    TRUE,
  122.         TAG_DONE);
  123.  
  124.         NewGadget . ng_GadgetText    = LocaleString(MSG_GLOBAL_CANCEL_GAD);
  125.         NewGadget . ng_GadgetID        = Counter;
  126.  
  127.         GadgetArray[Counter] = Gadget = CreateGadget(BUTTON_KIND,Gadget,&NewGadget,
  128.             SZ_Adjust,    TRUE,
  129.             SZ_AutoWidth,    TRUE,
  130.             SZ_GroupNext,    TRUE,
  131.         TAG_DONE);
  132.     }
  133.  
  134.     return(Gadget);
  135. }
  136.  
  137. VOID
  138. CursorPanel(struct CursorKeys *CursorKeys)
  139. {
  140.     struct Window        *PanelWindow;
  141.     struct Gadget        *GadgetList = NULL;
  142.     struct Gadget        *GadgetArray[GAD_CANCEL + 1];
  143.     LONG             i;
  144.  
  145.     struct CursorKeys    *Keys;
  146.     ULONG             OldCRC;
  147.  
  148.     OldCRC = DoCRC(CursorKeys,sizeof(struct CursorKeys));
  149.  
  150.     if(Keys = (struct CursorKeys *)AllocVec(sizeof(struct CursorKeys),MEMF_ANY|MEMF_CLEAR))
  151.     {
  152.         CopyMem(CursorKeys,Keys,sizeof(struct CursorKeys));
  153.  
  154.         if(CreateAllGadgets(GadgetArray,&GadgetList))
  155.         {
  156.             if(PanelWindow = OpenWindowTags(NULL,
  157.                 WA_Left,    GetScreenLeft(Window) + (GetScreenWidth(Window) - SZ_GetWindowWidth()) / 2,
  158.                 WA_Top,        GetScreenTop(Window) + (GetScreenHeight(Window) - SZ_GetWindowHeight())    / 2,
  159.                 WA_Width,    SZ_GetWindowWidth(),
  160.                 WA_Height,    SZ_GetWindowHeight(),
  161.  
  162.                 WA_Activate,    TRUE,
  163.                 WA_DragBar,    TRUE,
  164.                 WA_DepthGadget,    TRUE,
  165.                 WA_CloseGadget,    TRUE,
  166.                 WA_RMBTrap,    TRUE,
  167.                 WA_DepthGadget,    TRUE,
  168.                 WA_CustomScreen,Window -> WScreen,
  169.  
  170.                 WA_IDCMP,    IDCMP_GADGETDOWN | IDCMP_CLOSEWINDOW | IDCMP_RAWKEY | IDCMP_VANILLAKEY | IDCMP_ACTIVEWINDOW | BUTTONIDCMP | CYCLEIDCMP | STRINGIDCMP,
  171.  
  172.                 WA_Title,    LocaleString(MSG_CURSORPANEL_CURSOR_PREFERENCES_TXT),
  173.             TAG_DONE))
  174.             {
  175.                 struct IntuiMessage    *Massage;
  176.                 ULONG             IClass,Code;
  177.                 struct Gadget        *Gadget;
  178.                 BYTE             Terminated = FALSE;
  179.  
  180.                 UBYTE             DummyBuffer[MAX_FILENAME_LENGTH],
  181.                             *DummyChar;
  182.  
  183.                 struct FileRequester    *FileRequest;
  184.  
  185.                 LONG             Modifier = 0;
  186.  
  187.                 GuideContext(CONTEXT_CURSOR);
  188.  
  189.                 PushWindow(PanelWindow);
  190.  
  191.                 AddGList(PanelWindow,GadgetList,(UWORD)-1,(UWORD)-1,NULL);
  192.                 RefreshGList(GadgetList,PanelWindow,NULL,(UWORD)-1);
  193.                 GT_RefreshWindow(PanelWindow,NULL);
  194.  
  195.                 for(i = 0 ; i < 4 ; i++)
  196.                 {
  197.                     GT_SetGadgetAttrs(GadgetArray[i],PanelWindow,NULL,
  198.                         GTST_String,Keys -> Keys[Modifier][i],
  199.                     TAG_DONE);
  200.                 }
  201.  
  202.                 ActiveGadget = NULL;
  203.  
  204.                 ClrSignal(SIG_BREAK);
  205.  
  206.                 while(!Terminated)
  207.                 {
  208.                     if(Wait(PORTMASK(PanelWindow -> UserPort) | SIG_BREAK) & SIG_BREAK)
  209.                     {
  210.                         CopyMem(Keys,CursorKeys,sizeof(struct CursorKeys));
  211.  
  212.                         break;
  213.                     }
  214.  
  215.                     while(!Terminated && (Massage = (struct IntuiMessage *)GT_GetIMsg(PanelWindow -> UserPort)))
  216.                     {
  217.                         IClass    = Massage -> Class;
  218.                         Code    = Massage -> Code;
  219.                         Gadget    = (struct Gadget *)Massage -> IAddress;
  220.  
  221.                         GT_ReplyIMsg(Massage);
  222.  
  223.                         if(IClass == IDCMP_ACTIVEWINDOW && ActiveGadget)
  224.                             ActivateGadget(ActiveGadget,PanelWindow,NULL);
  225.  
  226.                         KeySelect(GadgetArray,GAD_CANCEL,Code,PanelWindow,&Gadget,&IClass,&Code);
  227.  
  228.                         if(IClass == IDCMP_GADGETDOWN)
  229.                         {
  230.                             if((Gadget -> GadgetType & GTYP_GTYPEMASK) == GTYP_STRGADGET)
  231.                                 ActiveGadget = Gadget;
  232.                         }
  233.  
  234.                         if(IClass == IDCMP_CLOSEWINDOW)
  235.                         {
  236.                             CopyMem(Keys,CursorKeys,sizeof(struct CursorKeys));
  237.  
  238.                             Terminated = TRUE;
  239.                         }
  240.  
  241.                         if(IClass == IDCMP_GADGETUP)
  242.                         {
  243.                             switch(Gadget -> GadgetID)
  244.                             {
  245.                                 case GAD_QUALIFIER:
  246.  
  247.                                     for(i = 0 ; i < 4 ; i++)
  248.                                         strcpy(Keys -> Keys[Modifier][i],SZ_GetString(GadgetArray[i]));
  249.  
  250.                                     Modifier = Code;
  251.  
  252.                                     for(i = 0 ; i < 4 ; i++)
  253.                                     {
  254.                                         GT_SetGadgetAttrs(GadgetArray[i],PanelWindow,NULL,
  255.                                             GTST_String,Keys -> Keys[Modifier][i],
  256.                                         TAG_DONE);
  257.                                     }
  258.  
  259.                                     break;
  260.  
  261.                                 case GAD_USE:
  262.  
  263.                                     Terminated = TRUE;
  264.  
  265.                                     for(i = 0 ; i < 4 ; i++)
  266.                                         strcpy(Keys -> Keys[Modifier][i],SZ_GetString(GadgetArray[i]));
  267.  
  268.                                     CopyMem(Keys,CursorKeys,sizeof(struct CursorKeys));
  269.  
  270.                                     break;
  271.  
  272.                                 case GAD_LOAD:
  273.  
  274.                                     strcpy(DummyBuffer,LastCursorKeys);
  275.  
  276.                                     DummyChar = PathPart(DummyBuffer);
  277.  
  278.                                     *DummyChar = 0;
  279.  
  280.                                     BlockWindow(PanelWindow);
  281.  
  282.                                     if(FileRequest = GetFile(LocaleString(MSG_CURSORPANEL_LOAD_CURSOR_KEYS_TXT),DummyBuffer,FilePart(LastCursorKeys),DummyBuffer,"#?.prefs",FALSE,FALSE,FALSE,LocaleString(MSG_GLOBAL_LOAD_TXT),TRUE))
  283.                                     {
  284.                                         if(!ReadIFFData(DummyBuffer,Keys,sizeof(struct CursorKeys),ID_KEYS))
  285.                                             MyEasyRequest(Window,LocaleString(MSG_CURSORPANEL_COULD_NOT_LOAD_CURSOR_KEYS_TXT),LocaleString(MSG_GLOBAL_CONTINUE_TXT),DummyBuffer);
  286.                                         else
  287.                                         {
  288.                                             OldCRC = DoCRC(Keys,sizeof(struct CursorKeys));
  289.  
  290.                                             CursorKeysChanged = FALSE;
  291.  
  292.                                             strcpy(Config -> FileConfig -> CursorFileName,DummyBuffer);
  293.  
  294.                                             strcpy(LastCursorKeys,DummyBuffer);
  295.  
  296.                                             for(i = 0 ; i < 4 ; i++)
  297.                                             {
  298.                                                 GT_SetGadgetAttrs(GadgetArray[i],PanelWindow,NULL,
  299.                                                     GTST_String,Keys -> Keys[Modifier][i],
  300.                                                 TAG_DONE);
  301.                                             }
  302.                                         }
  303.                                     }
  304.  
  305.                                     ReleaseWindow(PanelWindow);
  306.  
  307.                                     break;
  308.  
  309.                                 case GAD_SAVE:
  310.  
  311.                                     strcpy(DummyBuffer,LastCursorKeys);
  312.  
  313.                                     DummyChar = PathPart(DummyBuffer);
  314.  
  315.                                     *DummyChar = 0;
  316.  
  317.                                     BlockWindow(PanelWindow);
  318.  
  319.                                     for(i = 0 ; i < 4 ; i++)
  320.                                         strcpy(Keys -> Keys[Modifier][i],SZ_GetString(GadgetArray[i]));
  321.  
  322.                                     if(FileRequest = GetFile(LocaleString(MSG_CURSORPANEL_SAVE_CURSOR_KEYS_TXT),DummyBuffer,FilePart(LastCursorKeys),DummyBuffer,"#?.prefs",TRUE,FALSE,FALSE,LocaleString(MSG_GLOBAL_SAVE_TXT),TRUE))
  323.                                     {
  324.                                         if(!WriteIFFData(DummyBuffer,Keys,sizeof(struct CursorKeys),ID_KEYS))
  325.                                             MyEasyRequest(Window,LocaleString(MSG_CURSORPANEL_COULD_NOT_SAVE_CURSOR_KEYS_TXT),LocaleString(MSG_GLOBAL_CONTINUE_TXT),DummyBuffer);
  326.                                         else
  327.                                         {
  328.                                             strcpy(LastCursorKeys,DummyBuffer);
  329.  
  330.                                             CursorKeysChanged = FALSE;
  331.  
  332.                                             OldCRC = DoCRC(Keys,sizeof(struct CursorKeys));
  333.                                         }
  334.                                     }
  335.  
  336.                                     ReleaseWindow(PanelWindow);
  337.  
  338.                                     break;
  339.  
  340.                                 case GAD_CANCEL:
  341.  
  342.                                     Terminated = TRUE;
  343.  
  344.                                     CopyMem(Keys,CursorKeys,sizeof(struct CursorKeys));
  345.  
  346.                                     break;
  347.                             }
  348.                         }
  349.                     }
  350.                 }
  351.  
  352.                 RemoveGList(PanelWindow,GadgetList,(UWORD)-1);
  353.  
  354.                 PopWindow();
  355.  
  356.                 CloseWindow(PanelWindow);
  357.             }
  358.         }
  359.  
  360.         FreeGadgets(GadgetList);
  361.  
  362.         FreeVec(Keys);
  363.     }
  364.  
  365.     CursorKeysChanged |= (OldCRC != DoCRC(CursorKeys,sizeof(struct CursorKeys)));
  366. }
  367.